填充颜色游戏

无语死了这题。

题目描述

小明最近迷上下面一款游戏。游戏开始时, 系统将随机生成一个 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.hqwc.cn/news/139083.html

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

相关文章

ITextRenderer将PDF转换为HTML详细教程

引入依赖 <dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf-itext5</artifactId><version>9.1.18</version></dependency> 问题一&#xff1a;输出中文字体 下载字体simsun.ttc 下载链接&am…

24届好未来数开笔试

目录 选择、多选SQL题目描述输入 目标解答解析 题目分享 选择、多选 Java, int x 1, float y 2, x/y 0.5 2. Hive 的数据结构 基本数据类型 复合数据类型 text 不是 Hive 内外表 建表时如果不显示声明表的类型为 外表 Kafka 通过&#xff08;&#xff09;避免任务重复执行…

《开箱元宇宙》:《福布斯》如何通过 Web3 改进讲故事的方式

你们是否想知道 The Sandbox 如何融入世界上最具标志性的品牌和名人的战略&#xff1f;在本期《开箱元宇宙》系列中&#xff0c;我们与《福布斯》一起探讨了他们为何决定在 The Sandbox 中尝试 Web3&#xff0c;以及他们如何改变讲故事的方式&#xff0c;以便在一次体验中吸引超…

[SQL | MyBatis] MyBatis 简介

目录 一、MyBatis 简介 1、MyBatis 简介 2、工作流程 二、入门案例 1、准备工作 2、示例 三、Mapper 代理开发 1、问题简介 2、工作流程 3、注意事项 4、测试 四、核心配置文件 mybatis-config.xml 1、environment 2、typeAilases 五、基于 xml 的查询操作 1、…

AR智能眼镜主板设计方案_AR眼镜PCB板设计

AR智能眼镜是一种采用先进技术的创新产品&#xff0c;具备强大的功能和性能。它采用了MTK8788八核 12nm低功耗硬件平台&#xff0c;搭载IMG GE830063OMhz或以上的GPU&#xff0c;并运行Android 11.0或以上的操作系统。该眼镜支持光波导1080P显示和LVDS接口自由曲面显示&#xf…

CSS详细解析二

05-显示模式 显示模式&#xff1a;标签&#xff08;元素&#xff09;的显示方式。 作用&#xff1a;布局网页的时候&#xff0c;根据标签的显示模式选择合适的标签摆放内容。 块级元素 特点&#xff1a; 独占一行 宽度默认是父级的100% 添加宽高属性生效 行内元素 特…

基于Springboot实现在线答疑平台系统项目【项目源码+论文说明】计算机毕业设计

基于Springboot实现在线答疑平台系统演示 摘要 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大师生的喜爱&#xff0c;也逐渐进入了每个学生的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本…

Messari发布Moonbeam简报,每日交易量稳步增长,首次公布利润数据

区块链数据公司Messari首次发布Moonbeam项目分析简报&#xff0c;从项目市值、链上数据表现、质押以及Moonbeam的技术优势XCM使用量等角度全面分析。这个再熊市初期上线的项目一直在默默开发&#xff0c;并在跨链互操作领域拥有了相当的实操成绩。我们翻译了Messari简报中的部分…

Element-UI 日期选择器--禁用未来日期

在做项目的时候经常会遇到一些报表需要填写日期&#xff0c;一般是填写当日及当日以前&#xff0c;这时候我们的日期选择器就需要进行一些限制&#xff0c;比如&#xff1a; 这样之后&#xff0c;就不会误填写到明天啦&#xff0c;下面让我们看一下代码实现 html页面代码 这里…

上市公司专利申请、创新绩效测算(2000-2022年)

参照王治等&#xff08;2022&#xff09;的做法&#xff0c;团队对上市公司-创新绩效进行测算。应用企业当年的专利申请数量&#xff08;Apply&#xff09;和企业当年的发明专利申请数量&#xff08;IApply&#xff09;衡量企业创新绩效 一、数据介绍 数据名称&#xff1a;上市…

C++之基于Winsock2封装UDPServer与UDPClient

文章目录 Socket过程UDPServer.hUDPServer.cppUDPClient.hUDPClient.cppmain.cppCMakeLists.txt测试截图 Socket过程 UDPServer UDPClient UDPServer.h #ifndef UDPSERVER_H_INCLUDED #define UDPSERVER_H_INCLUDED#include <iostream> #include <string> #inclu…

VR、AR、MR、XR到底都是什么?有什么区别

目录 VRARMRXRAR、VR、MR、XR的区别 VR 英&#xff1a;Virtual Reality 中文翻译&#xff1a;虚拟现实 又称计算机模拟现实。是指由计算机生成3D内容&#xff0c;为用户提供视觉、听觉等感官来模拟现实&#xff0c;具有很强的“临场感”和“沉浸感”。我们可以使用耳机、控制器…