当前位置: 首页 > news >正文

蓝桥杯 01游戏

问题描述

小蓝最近玩上了 01 游戏,这是一款带有二进制思想的棋子游戏。

游戏在一个大小为 N × N 的棋盘上进行。棋盘上的每个位置都需要放置一个数字 01。初始情况下,棋盘上有一部分位置已经放置了固定的数字,玩家不可以更改这些位置。其他的空白位置由玩家填入数字。

玩家需要使得最终棋盘满足以下条件:

  1. 所有的空白位置都必须填入 01
  2. 在水平方向或垂直方向上,相同的数字不能连续出现超过两次;
  3. 每一行和每一列上,数字 01 的数量必须相等(例如当 N = 4 时,每行/列需要有 2 个 0 和 2 个 1);
  4. 每一行必须是唯一的,不能和其他行完全相同;同理,每一列也必须是唯一的。

题目保证所有测试数据都有且仅有一个唯一的解。


输入格式

  • 第一行包含一个整数 N,表示棋盘的大小。
  • 接下来的 N 行每行包含 N 个字符,字符只可能是 01_
    • 0 表示该位置固定为数字 0;
    • 1 表示该位置固定为数字 1;
    • _ 表示该位置为空白,由玩家填入。

输出格式

输出 N 行,每行 N 个字符,只包含 01,表示填完后的棋盘。


样例输入

6
_0____
____01
__1__1
__1_0_
______
__1___

样例输出

100110
010101
001011
101100
110010
011001

评测用例规模与约定

  • 对于 60% 的评测用例,2 ≤ N ≤ 6
  • 对于 100% 的评测用例,2 ≤ N ≤ 10,且 N 为偶数

运行限制

编程语言最大运行时间最大运行内存
C++1 秒256 MB
C1 秒256 MB
Java2 秒256 MB
Python33 秒256 MB
PyPy33 秒256 MB
Go3 秒256 MB
JS3 秒256 MB

难度:困难
标签:2023、国赛、搜索、剪枝

c++代码

#include<bits/stdc++.h>

using namespace std;

int N;
vector<vector<int>> arr;
string s;
bool sym = false;
vector<int> col0, row0, col1, row1;

bool check(int i, int j) {
    if (i >= 2) {
        if (arr[i][j] == 0 && arr[i - 1][j] == 0 && arr[i - 2][j] == 0) return false;
        if (arr[i][j] == 1 && arr[i - 1][j] == 1 && arr[i - 2][j] == 1) return false;
    }
    if (j >= 2) {
        if (arr[i][j] == 0 && arr[i][j - 1] == 0 && arr[i][j - 2] == 0) return false;
        if (arr[i][j] == 1 && arr[i][j - 1] == 1 && arr[i][j - 2] == 1) return false;
    }
    return true;
}

bool myunique() {
    unordered_set<string> st;
    for (int i = 0; i < N; i++) {
        string str;
        for (int j = 0; j < N; j++) {
            str += to_string(arr[i][j]);
        }
        if (st.find(str) != st.end()) return false;
        else st.insert(str);
    }
    st.clear();
    for (int i = 0; i < N; i++) {
        string str;
        for (int j = 0; j < N; j++) {
            str += to_string(arr[j][i]);
        }
        if (st.find(str) != st.end()) return false;
        else st.insert(str);
    }
    return true;
}

void dfs(int i, int j, int cur) {
    if (sym || (arr[i][j] != -1 && arr[i][j] != cur)) return;
    int x = i, y = j;
    bool key = arr[i][j] == -1 ? true:false;
    arr[i][j] = cur;
    if (!check(i, j)) {
        if (key) arr[i][j] = -1;
        return;
    }
    if (arr[i][j] == 0) row0[i]--, col0[j]--;
    else row1[i]--, col1[j]--;
    if (j == N - 1) x++, y = 0;
    else y++;
    if (x == N) {
        if (myunique()) {
            sym = true;
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    printf("%d", arr[i][j]);
                }
                printf("\n");
            }
        }
        return;
    }
    if (row0[x] > 0 && col0[y] > 0) dfs(x, y, 0);
    if (row1[x] > 0 && col1[y] > 0) dfs(x, y, 1);
    if (arr[i][j] == 0) row0[i]++, col0[j]++;
    else row1[i]++, col1[j]++;
    if (key) arr[i][j] = -1;
}

int main() {
    cin >> N;
    arr = vector<vector<int>>(N, vector<int>(N));
    row0 = vector<int>(N, N / 2), col0 = vector<int>(N, N / 2);
    row1 = vector<int>(N, N / 2), col1 = vector<int>(N, N / 2);
    for (int i = 0; i < N; i++) {
        cin >> s;
        for (int j = 0; j < N; j++) {
            if (s[j] == '0') arr[i][j] = 0;
            else if (s[j] == '1') arr[i][j] = 1;
            else arr[i][j] = -1;
        }
    }
    dfs(0, 0, 0);
    dfs(0, 0, 1);
    return 0;
}//by wqs
http://www.dtcms.com/a/105114.html

相关文章:

  • 数据结构 哈希表 字符串哈希
  • VMware安装Ubuntu实战分享
  • 【算法学习计划】贪心算法(下)
  • 在ensp进行OSPF+RIP+静态网络架构配置
  • [GESP202503 C++六级题解]:P11963:环线
  • 关于VMware Tools 不再随旧版客户机操作系统的 VMware Workstation 一起提供。
  • 高级java每日一道面试题-2025年3月22日-微服务篇[Nacos篇]-Nacos的主要功能有哪些?
  • TBKDVR硬盘录像机device.rsp命令执行漏洞
  • CISCO路由器配置DHCP中继
  • YOLOv12即插即用-Pconv(风车卷积)
  • QT自定义信号与槽
  • NHANES指标推荐:TyG-BMI
  • 自然语言处理|如何用少样本技术提升低资源语言处理?
  • acwing 5438. 密接牛追踪2
  • MaxEnt物种分布建模全流程;R+ArcGIS+MaxEnt模型物种分布模拟、参数优化方法、结果分析制图与论文写作
  • Minimind 训练一个自己专属语言模型
  • 什么是BSCI验厂?BSCI验厂的好处?BSCI验厂的意义
  • 小程序29-事件穿参-mark 自定义数据
  • 基于SpringBoot的“考研学习分享平台”的设计与实现(源码+数据库+文档+PPT)
  • 【更新至2023年】1987-2023年各省专利申请授权数据(8个指标)
  • 自然语言处理(28:(终章Attention 4.)关于Attention的其他话题)
  • 1KHZ的带通滤波器设计与仿真
  • 动态规划入门:从记忆化搜索到递推
  • 华为IP(3)
  • 去中心化借贷机制解析
  • MySQL 进阶 面经级
  • Oracle 数据库中优化 INSERT INTO 操作的性能
  • 量子计算与人工智能融合的未来趋势
  • 预训练(Pre-training) 和 微调(Fine-tuning)
  • 机器学习(总节环节)