填充颜色游戏

news2025/1/18 4:36:01

无语死了这题。

题目描述

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

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

相关文章

MSQL系列(四) Mysql实战-索引 Explain实战

Mysql实战-索引 Explain实战 前面我们讲解了索引的存储结构&#xff0c;我们知道了BTree的索引结构&#xff0c;也了解了索引最左侧匹配原则&#xff0c;到底最左侧匹配原则在我们的项目中有什么用&#xff1f;或者说有什么影响&#xff1f;今天我们来实战操作一下&#xff0c…

Yakit工具篇:子域名收集的配置和使用

简介(来自官方文档) 子域名收集是指通过各种技术手段&#xff0c;收集某个主域名下所有的子域名列表。子域名是指在主域名前面添加一级或多级名称的域名。例如&#xff0c;对于主域名example.com&#xff0c;其子域名可以是www.example.com、mail.example.com、blog.example.c…

MIT6.5830 Lab0-Go tutorial实验记录(二)

MIT6.5830 Lab0-Go tutorial实验记录&#xff08;二&#xff09; – WhiteNights Site 标签&#xff1a;Golang, 数据库 在将数据库的数据转换为图表前&#xff0c;我们需要先测试是否能正常访问数据库文件。 写者注 为什么要怎么做&#xff1f;因为这块 非常容易出问题。在h…

计算机基础知识33

进程基础(操作系统中的概念) 进程它是操作系统总最重要的概念&#xff0c;线程也是 进程和线程都是有操作系统来调度使用的&#xff0c;我们程序员是不能控制的 # 进程和程序是两码事、完全不一样 程序&#xff1a;其实一个死的东西、一堆代码就是程序&#xff0c;它也没有生命…

【5】c++11新特性(稳定性和兼容性)—>override关键字

override关键字很简单&#xff0c;就是起到一个检查的作用&#xff0c;父类中有一个虚函数&#xff0c;子类要去重写这个虚函数&#xff0c;那么在子类重写时&#xff0c;函数后面加上override&#xff0c;就会检查子类中重写的这个函数和父类中这个虚函数名是否一样&#xff0…

FISCO过程中存在的的问题

问题1&#xff1a;端口被占 报错&#xff1a;Exceed waiting time. Please try again to start node0 initConfig for P2PInitializer failed,check Port30303,EINFOThrow location unknown (consider using BOOST_THROW_EXCEPTION) Dynamic exception type: boost::exception_…

80026-044-06-R 数字伺服驱动器提供了更好的配置和性能

80026-044-06-R 数字伺服驱动器提供了更好的配置和性能 由于它们的精密性能&#xff0c;伺服驱动器被用于机器人&#xff0c;自动化&#xff0c;数控加工&#xff0c;甚至在过程中制造半导体. 一些运动控制应用使用模拟伺服驱动器&#xff0c;这是一项久经考验的技术。虽然它…

数据结构之顺序表的模拟实现

&#x1f495;"世事犹如书籍&#xff0c;一页页被翻过去。人要向前看&#xff0c;少翻历史旧账。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;数据结构之顺序表的模拟实现 /*** Created with IntelliJ IDEA.* Description:* User: 绿字* Date:…

【EI会议征稿通知】第四届电网系统与绿色能源国际学术会议(PGSGE 2024)

JPCS独立出版-第四届电网系统与绿色能源国际学术会议&#xff08;PGSGE 2024&#xff09; 2024 4th International Conference on Power Grid Systems and Green Energy 2024年第四届电网系统与绿色能源国际学术会议(PGSGE 2024) 将于2024年01月05-07日在中国厦门召开。本次会…

【计算机网络】第一章——概述

个人主页直达&#xff1a;小白不是程序媛 系列专栏&#xff1a;计算机网络基础 目录 前言 计算机网络概述 概念 功能 组成 分类 标准化工作 性能指标 速率 带宽 吞吐量 时延 时延带宽积 往返时延RTT 利用率 分层 为什么要分层&#xff1f; 分层的基本原则&am…

【Java实战】创建第一个Springboot项目Hello world

没有旗舰版的Idea授权&#xff0c;所以安装了社区版的idea。不知道从何时开始&#xff0c;社区版IDEA的插件不好用了&#xff0c;所以就换了个方法生成Springboot项目。 一 在线生成 选择好对应的选项后&#xff0c;点击生成就可以下载到一个完整的springboot项目了。 二 使用…

倍福tnzip,tszip,tpzip文件的打开方式

文章目录 一. tnzip的打开方式二. tszip打开方法三. tpzip打开方法 一. tnzip的打开方式 打开项目&#xff1a;选择菜单栏 FILE&#xff0c;点击 Open Solution from Archive…&#xff0c;在弹出的 对话框中选择保存好的文件&#xff0c;单击打开。选择展开此项目的路径&…

处理sass-loader安装失败

Vue项目中安装node-sass跟sass-loader 我们在开发中,经常会使用sass语法来编写css&#xff0c;在安装node-sass和sass-loader时&#xff0c;经常会出现错误&#xff08;通常是依赖冲突&#xff09;导致安装失败。因为官方发布的版本号并不是连续的&#xff0c;有些版本与版本之…

【RocketMQ系列六】RocketMQ事务消息

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

海洋CMS仿爱美剧影视电影视频网站模版源码/自适应手机端

海洋CMS仿爱美剧网站模板&#xff0c;自适应手机端&#xff0c;内含视频、资讯、留言模块。 下载地址&#xff1a;https://bbs.csdn.net/topics/617419787

wps/word 之 word中的两个表格 如何合并成为一个表格(已解决)

第一步&#xff1a;新建两个表格&#xff1a; 如何实现上面的两个表格合并呢&#xff1f; 分别选定每个表格&#xff0c;然后鼠标右键---》表格属性 在表格属性中的 表格---》选择 无文字环绕。 第二个表格按照同样的方法 设置 无文字环绕。 然后将中的文本行删去即可以了。选…

金融液冷数据中心,噱头还是趋势?

当前&#xff0c;全社会数字化进程加速&#xff0c;金融行业已全面进入数字化和智能化时代。与此同时&#xff0c;随着云计算、分布式架构、大数据分析、通用人工智能等技术的广泛运用&#xff0c;金融行业从数据大集中到分布式融合&#xff0c;金融企业的数据中心建设正围绕其…

什么是MIMO?

什么是MIMO&#xff1f;从SISO到MIMO - 华为 (huawei.com) MIMO&#xff08;Multiple-Input Multiple-Output&#xff09;是指在无线通信领域使用多天线发送和接收信号的技术。MIMO技术主要应用在Wi-Fi&#xff08;WiFi&#xff09;领域和移动通信领域&#xff0c;可以有效提高…

Unity之ShaderGraph如何实现光边溶解

前言 今天我们来实现一个最常见的随机溶剂效果。如下图所示&#xff1a; 光边溶解效果&#xff1a; 无光边效果 主要节点 Simple Noise&#xff1a;根据输入UV生成简单噪声或Value噪声。生成的噪声的大小由输入Scale控制。 Step&#xff1a;对于每个组件&#xff0c;如果输…

软件招标测试包含哪些测试?对软件项目起到什么作用?

在当前日益竞争激烈的软件市场中&#xff0c;一款优质的软件产品是企业获得竞争优势的关键。而软件招标测试正是评估软件质量的重要环节。   那么&#xff0c;什么是软件招标测试呢?简单来说&#xff0c;软件招标测试主要是验证软件产品的关键指标是否符合投标书要求。它通过…