填充颜色游戏

无语死了这题。

题目描述

小明最近迷上下面一款游戏。游戏开始时, 系统将随机生成一个 N × N  的  正方形棋盘, 棋盘的每个格子都由六种颜色中的一种绘制。在每个步骤中, 玩家选择一种颜色, 并将与左上角连接的所有网格更改为该特定颜色。“两  个网格是连接的”这一说法意味着这两个网格之间存在一条路径,条件是  该路径上的相邻网格具有相同的颜色并共享一条边。通过这种方式,玩家  可以从起始网格(左上角) 给棋盘涂色, 直至所有网格都是相同的颜色。下  图显示了 4×4 游戏的前两个步骤(颜色标记为 0 到 5):

解题思路

  1. 这个问题的核心是使用BFS来模拟棋盘上的颜色填充过程。
  2. 初始时,我们从左上角的颜色开始,并逐步改变与左上角相连接的区域的颜色。
  3. 为了优化算法,我们首先检查了两个特定情况:是否只有两种颜色1和2,并分别处理它们,因为单一的算法对这种特殊情况总比实际步数多1。
  4. 如果没有符合特定情况,我们开始执行BFS逻辑,直到整个棋盘被填满为止。
#include <iostream>
#include <vector>
#include <queue>
#include <set>
#include <tuple>using namespace std;const int dx[] = { 1, -1, 0, 0 };
const int dy[] = { 0, 0, 1, -1 };bool is_valid(int x, int y, int n) {return 0 <= x && x < n && 0 <= y && y < n;
}int bfs(vector<vector<int>>& board, int n) {// 检查特定情况1和2int count1 = 0, count2 = 0;for (int i = 0; i < n; ++i)for (int j = 0; j < n; ++j) {if (board[i][j] == 1) count1++;if (board[i][j] == 2) count2++;}if (count1 + count2 == n * n) {  if (count2 < count1) return 1;  if (count1 == count2) return 2; }set<vector<vector<int>>> visited;queue<tuple<int, int, vector<vector<int>>>> q;q.push({ board[0][0], 0, board });while (!q.empty()) {int color, steps;vector<vector<int>> cur_board;tie(color, steps, cur_board) = q.front();q.pop();bool all_same = true;for (int i = 0; i < n && all_same; ++i)for (int j = 0; j < n && all_same; ++j)if (cur_board[i][j] != color) all_same = false;if (all_same) return steps;for (int new_color = 0; new_color < 6; ++new_color) {if (new_color == color) continue;vector<vector<int>> new_board = cur_board;vector<pair<int, int>> stack = { {0, 0} };while (!stack.empty()) {int x, y;tie(x, y) = stack.back();stack.pop_back();for (int i = 0; i < 4; ++i) {int nx = x + dx[i], ny = y + dy[i];if (is_valid(nx, ny, n) && new_board[nx][ny] == color) {new_board[nx][ny] = new_color;stack.push_back({ nx, ny });}}}if (visited.find(new_board) == visited.end()) {visited.insert(new_board);q.push({ new_color, steps + 1, new_board });}}}return -1;
}int main() {int n;cin >> n;vector<vector<int>> board(n, vector<int>(n));for (int i = 0; i < n; ++i)for (int j = 0; j < n; ++j)cin >> board[i][j];cout << bfs(board, n) << endl;return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/110491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jenkins 安装与使用、用户权限划分

jenkins 安装与使用 安装插件&#xff1a; 开启该插件功能 验证用户管理 创建web01~02 使用web01登录 用户权限划分 安装 Role-Based Strategy 插件后&#xff0c;系统管理 中多了如图下所示的一个功能&#xff0c;用户权限的划分就是靠他来做的 创建角色 重新访问 创建项目…

Spring Boot 3.2四个新特点提升运行性能

随着 Spring Framework 6.1 和 Spring Boot 3.2 普遍可用性的临近&#xff0c;我们想分享一下 Spring 团队为让开发人员优化其应用程序的运行时效率而做出的几项努力的概述。 我们将介绍以下技术和用例&#xff1a; Spring MVC 将使用 基于JDK 21 虚拟线程 Web 堆栈使用 Spri…

Zabbix“专家坐诊”第207期问答汇总

问题一 Q&#xff1a;不小心把host表删除了&#xff0c;怎么处理&#xff1f;现在使用的zabbix 4.0.3的server&#xff0c;agent是4.2.1&#xff0c;能不能不动agent的情况下升级server版本&#xff0c;重新部署&#xff1f; A&#xff1a;数据库有备份话恢复即可&#xff0c;…

SSTI模板注入(flask) 学习总结

文章目录 Flask-jinja2 SSTI 一般利用姿势SSTI 中常用的魔术方法内建函数 利用 SSTI 读取文件Python 2Python 3 利用 SSTI 执行命令寻找内建函数 eval 执行命令寻找 os 模块执行命令寻找 popen 函数执行命令寻找 importlib 类执行命令寻找 linecache 函数执行命令寻找 subproce…

华为FAT模式无线AP配置实例

硬件&#xff1a;AP3010DN 软件版本&#xff1a;VRP software, Version 5.170 (AP3010DN-V2 FAT V200R010C00SPCf02) [Huawei]dis ver Huawei Versatile Routing Platform Software VRP (R) software, Version 5.170 (AP3010DN-V2 FAT V200R010C00SPCf02) Copyright (C) 2011…

windows中elasticsearch7中添加用户名密码验证

1.找到elsatic的bin目录输入cmd 2.生成ca证书 输入 elasticsearch-certutil ca 在es7根目录生成ca证书&#xff0c;输入密码时直接回车即可&#xff0c;否则后面会报错 Please enter the desired output file [elastic-stack-ca.p12]: #这里直接回车即可 Enter password for…

JAVA学习日记1——JAVA简介及第一个java程序

简单记忆 JAVA SE &#xff1a;标准版&#xff0c;核心基础 JAVA EE&#xff1a;企业版&#xff0c;进阶 JDK&#xff1a;Java Development Kit&#xff0c;Java开发工具包&#xff0c;包含JRE JRE&#xff1a;Java Runtime Environment&#xff0c;Java运行时环境&#xff…

flutter 消息并发时处理,递归查询

收到新消息的时候执行receiveNewConversation方法 可以自己模拟一下两条数据插入&#xff0c;延时执行插入会话的操作 收到一条新的会话消息&#xff0c;先记录会话ID到列表&#xff0c;直到第一条处理完&#xff08;插入数据库后清理这个会话ID&#xff09;&#xff0c;才处理…

mybatis generator 表名多了个点

csdn有一个&#xff0c;要收费&#xff0c;研究后原因如下&#xff0c;是 mysql不支持 SQL catalogs and schema&#xff0c; 解决方式就是去掉 这两个字段&#xff0c;同时在jdbcConnection中设置nullCatalogMeansCurrent属性为true。 手册如下 MySql does not properly supp…

手撕 视觉slam14讲 ch7 / pose_estimation_3d2d.cpp (2)

上一篇文章中: 手撕ch7/pose_estimation_3d2d&#xff08;1&#xff09;&#xff0c;我们调用了epnp的方法进行位姿估计&#xff0c;这里我们使用非线性优化的方法来求解位姿&#xff0c;使用g2o进行BA优化 首先介绍g2o&#xff1a;可参考&#xff1a;g2o详细介绍 1.构建g2o图…

MLE<=> KL

MLE等价于KL散度 最大似然估计 (MLE) 和Kullback-Leibler散度 (KL散度) 之间有深厚的联系。我将先介绍两者之间的联系&#xff0c;然后通过一个例子进行说明。 首先&#xff0c;回忆一下两者的定义: 最大似然估计: θ ^ arg ⁡ max ⁡ θ L ( θ ∣ X ) \hat{\theta}\arg \m…

加权平均、EMD、小波等方法去噪效果对比

加权平均、EMD、小波等方法去噪效果对比 代码 整体代码如下 %% clear all; clc;load(data_filter120Hz.mat); %可自己生成随机噪声 fs1000;%采样频率是1000Hz %% %生成正弦波信号 tlinspace(0, length(data)/fs-1/fs, length(data)); y1 15*sin(2*pi* 2.8 *t);%生成频率为2.…

Android之使用QBadgeView给TabLayout顶部栏设置数量角标,数值可更新

TabLayout搭配ViewPager、Fragement使用可看另一篇文章&#xff1a; Android中TabLayoutViewPagerFragment实现顶部导航栏 本文主要描述给TabLayout的某一栏添加角标&#xff0c;数值可更新&#xff1a; 一、效果 二、TabLayout使用 1、xml文件中 <com.google.android.m…

通讯协议学习之路:QSPI协议理论

通讯协议之路主要分为两部分&#xff0c;第一部分从理论上面讲解各类协议的通讯原理以及通讯格式&#xff0c;第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN&#xff1b;视频会发布在bilibili(UID:399951374) 一、…

【Django 01】环境搭配与项目配置

1. 介绍 https://github.com/Joe-2002/sweettalk-django4.2#readme Django 是一个使用 Python 编写的开源 Web 应用程序框架&#xff0c;它提供了一套用于快速开发安全、 可扩展和高效的 Web 应用程序的工具和功能。Django 基于 MVC&#xff08;Model-View-Controller&#xf…

Windows11家庭版没有本地组策略编辑器解决

1. 新建一个文本文件将下面代码粘到里面&#xff0c;保存后修改后缀为.cmd或者.bat echo off pushd "%~dp0"dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt dir /b C:\Windows\servicing\Packa…

redis(普通连接和连接池、字符串类型、hash类型、列表类型)

1 redis普通连接和连接池 1.1 普通连接 1.2 连接池 2 redis字符串类型 3 redis hash类型 4 redis列表类型 1 redis普通连接和连接池 #1 python 代码作为客户端---》连接# 2 安装模块&#xff1a;pip install redis1.1 普通连接 from redis import Redisconn Redis(host&qu…

Selenium浏览器自动化怎么上传文件

Selenium 封装了现成的文件上传操作。但是随着现代前端框架的发展&#xff0c;文件上传的方式越来越多样。而有一些文件上传的控件&#xff0c;要做自动化控制会更复杂一些&#xff0c;这篇文章主要讨论在复杂情况下&#xff0c;如何通过自动化完成文件上传。 1. input 元素上传…

蓝桥杯每日一题2023.10.17

迷宫 - 蓝桥云课 (lanqiao.cn) 题目描述 样例&#xff1a; 01010101001011001001010110010110100100001000101010 00001000100000101010010000100000001001100110100101 01111011010010001000001101001011100011000000010000 0100000000101010001101000010100000101010101100…

Ubuntu18中的连接网络图标恢复

上图的图标不存在&#xff0c;也连不上网。 输入命令停止网络管理 service NetworkManager stop删除网络管理缓存文件 sudo rm /var/lib/NetworkManager/NetworkManager.state重启网络管理 service NetworkManager start修改网络管理文件 将‘managedfalse’修改为‘man…