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(1n,m1000),表示给定的扫雷地图的大小。

接下来的 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 中修改一个单元格。然后 AAABBB 中非地雷单元格上的数字之和都等于 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 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐