1 条题解
-
0
自动搬运
来自洛谷,原作者为

Vct14
**搬运于
2025-08-24 22:52:07,当前版本为作者最后更新于2023-11-06 13:19:55,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题目大意
给定两张 的扫雷地图 和 ,请你改变 图中的 个格子,使两张图上的非地雷格上的数字(周围 个格子中的地雷数)之和相同。若有解,输出修改后的 图;若无解,输出 。
结论
定义一个图 的“反地图”为将 中的地雷格替换为非地雷格,非地雷格替换为地雷格的扫雷地图 。
将 改为 或 的反地图 即可。没有无解的情况。
证明
- 或 的反地图 两张图上的非地雷格上的数字之和相同。
对于相邻的两个格子:
- 若其中一个为地雷格,另外一个为非地雷格,则它的贡献为 ,反转后的贡献也为 ,所以它们的贡献相同。
- 若两个格子相同,则它们的贡献均为 ,也相同。
综上,任意两个相邻的格子都可以取反,取反后贡献不变。
因此, 或 的反地图 两张图上的非地雷格上的数字之和相同。
- 将 改为 或 的反地图 所需的修改次数不大于 。
设 和 有 个格子不同,即将 改为 需要修改 次:
因为 与 所有格子都不同,所以 与 有 个格子不同,需要修改 次。
那么题目可化为证明 和 中必有一数不大于 。这是显然的。
所以将 改为 或 的反地图 所需的修改次数不大于 。
代码
#include<bits/stdc++.h> using namespace std; int getbomb(){ char bomb; cin>>bomb; if(bomb=='X') return 1; else return 0; } void outbomb(bool b){ if(b) cout<<"X"; else cout<<"."; } bool a[1002][1002]; int main(){ int n,m; cin>>n>>m; int k=0; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) a[i][j]=getbomb(); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) if(getbomb()!=a[i][j]) k++; if(k<=n*m/2){ for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++) outbomb(a[i][j]); cout<<"\n"; } } else{ for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++) outbomb(!a[i][j]); cout<<"\n"; } } return 0; }
- 1
信息
- ID
- 9321
- 时间
- 1000ms
- 内存
- 1024MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者