ICPC2020上海B - Mine Sweeper II
2024-10-22 05:04:59
思维
[B-Mine Sweeper II_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海)(重现赛)@hzy0227 (nowcoder.com)](https://codeforces.com/gym/103202/problem/I)
题意
在 \(n*m\;(1<=n,m<=1000)\) 的网格中扫雷,雷上没有数字,别的格子上的数字表示以它为中心的九宫格中的雷的个数
给出两个雷图A,B,"X"代表雷,"." 代表没有雷,每次操作可以将 B 中任意一个格子反转(雷变非雷,非雷变雷),求是否可以在 \(\lfloor\frac {n*m}2\rfloor\) 次操作内使 B 的各个格子的数字和 == A 的各个格子的数字和,并给出 B 最终的雷图
思路
思考数字的含义是什么,不完全是一个格子周围的雷的数量,因为如果当前格子是雷的话,他周围的雷对它就没有贡献了
数字的真正含义是相邻的(雷,非雷)对数,因此反转整个图后这个数是不变的
所以可以尝试把 B 直接变成 A,如果次数超了就把 B 变成 A 的反图
代码
#include<bits/stdc++.h>
typedef long long ll;
typedef std::pair<int, int> PII;
#define ALL(x) x.begin(),x.end()
#define pb push_back
#define fi first
#define se second
#define endl '\n'
using namespace std;
const int N = 1e3 + 10;
char a[N][N], b[N][N];
int n, m;
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> a[i][j];
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> b[i][j];
int cnt = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (a[i][j] != b[i][j])
cnt++;
if (cnt > n * m / 2)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (a[i][j] == 'X')
a[i][j] = '.';
else
a[i][j] = 'X';
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
cout << a[i][j];
cout << endl;
}
return 0;
}
最新文章
- Spring中的JDBCTemplate
- 在 Arch Linux 玩百度 Flash 战曲游戏乱码
- Oracle sqlplus设置显示格式命令详解
- hdu 4036 2011成都赛区网络赛F 模拟 **
- sql 查询 &ndash; left join on
- OO之美3
- UBoot讲解和实践-----------讲解(一)
- 【待补】java开发Web Service
- Codeforces Gym 100650C The Game of Efil DFS
- openstack 手动安装版 功能测试
- Android-4
- JSP内置对象--4种属性范围 (pageContext,request,session,application)
- 如何获取app的素材,做出一个高仿的app
- 编写一个python脚本功能-备份
- SpringBoot开发案例之打造私有云网盘
- mongoDB 文档操作_增
- R语言语法基础一
- [微信小程序] 通过快速启动demo分析小程序入门关键点
- JavaScrip(一)JavaScrip的写法
- 支持向量机通俗导论(理解SVM的三层境界)(ZT)