P9820 [ICPC 2020 Shanghai R] Mine Sweeper II

题目描述

扫雷地图 XXX 可以表示为一个 n×mn \times mn×m 的网格。网格中的每个单元格要么是地雷单元格,要么是非地雷单元格。地雷单元格上没有数字。每个非地雷单元格有一个数字,表示其周围地雷单元格的数量。(如果一个单元格与另一个单元格共享至少一个公共点,则它们是相邻的。因此,每个不在边界上的单元格周围有 888 个单元格。)以下是一个 16×3016 \times 3016×30 的扫雷地图,其中标记的单元格表示地雷单元格,空白单元格表示数字为 0 的非地雷单元格。

给定两个大小为 n×mn \times mn×m 的扫雷地图 A,BA, BA,B,你应该在 BBB 中修改最多 $ \left\lfloor \frac{nm}{2} \right\rfloor $(即小于或等于 nm2\frac{nm}{2}2nm​ 的最大非负整数)个单元格(从非地雷单元格变为地雷单元格或反之),使得 AAA 中非地雷单元格的数字之和与 BBB 中非地雷单元格的数字之和相同。(如果地图中没有非地雷单元格,则和被视为 000。)

如果存在多个解,输出其中任意一个。如果不存在解,输出一行 -1。

输入格式

第一行包含两个整数 n,m (1≤n,m≤1000)n, m\,(1\le n,m \le 1000)n,m(1≤n,m≤1000),表示给定的扫雷地图的大小。

接下来的 nnn 行的第 iii 行包含一个长度为 mmm 的字符串,由 . 和 X 组成,表示扫雷地图 AAA 的第 iii 行。. 表示非地雷单元格,X 表示地雷单元格。

接下来的 nnn 行的第 iii 行包含一个长度为 mmm 的字符串,由 . 和 X 组成,表示扫雷地图 BBB 的第 iii 行。. 表示非地雷单元格,X 表示地雷单元格。

输出格式

如果不存在解,输出一行 -1。

否则,输出 nnn 行表示修改后的扫雷地图 BBB。第 iii 行应包含一个长度为 mmm 的字符串,由 . 和 X 组成,表示修改后的地图 BBB 的第 iii 行。. 表示非地雷单元格,X 表示地雷单元格。

请注意,您不需要输出非地雷单元格上的数字,因为这些数字可以通过输出的扫雷地图确定。

输入输出样例 #1

输入 #1

2 4
X..X
X.X.
X.X.
.X..

输出 #1

X.XX
.X..

说明/提示

我们在 BBB 中修改一个单元格。然后 AAA 和 BBB 中非地雷单元格上的数字之和都等于 10。

题面翻译由 ChatGPT-4o 提供。

C++实现

#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;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐