B-マインスイーパII

2020 ICPC上海ステーションB
の元の質問へのリンク:https://ac.nowcoder.com/acm/contest/10330/Bこの
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
質問は
、サイズn * mの2つの掃海計画AとBを提供すること目的としています。最大n * m / 2の変換を渡す必要があります(変換とは、地雷ではないグリッドを地雷に変えること、または地雷であるグリッドを空白のグリッドに変えることを指します)。そのため、B画像の値は次のようになります。 A画像の値に等しい(値はすべての掃海画像を指します。数値または雷がない場合、値は0です)

考える
実際、この質問は、1つのことが関連している限り、それで十分です。
(彼の周りの空白の正方形に対する地雷の効果)は(彼の周りのすべての空白の正方形を地雷に変えて自分自身を空白の正方形に変える効果)と同等です、つまり、これは絵を反転させます(サンダーは空白になり、空白になります雷になります)、これは実際には元の画像と同じです。また、タイトルには、最大mn / 2の変換操作を実行できると記載されており、B画像をA画像またはAの逆(これは補完画像と呼ぶ必要があります)に変換する必要があります。つまり、-1の状況はありません。補足画像を見つけて、AまたはAのどちらの補完画像がnm / 2未満でBに変換されるかを確認する限り。その画像で十分です。あまり明確ではないかもしれません。許してください。

ACコード

#include <bits/stdc++.h>
using namespace std;
#define maxn 1005

char G[maxn][maxn];// 图A
char G2[maxn][maxn];// 图A 的 补图
char K[maxn][maxn];// 图B
int n, m;

int main(){
    
    
	scanf("%d %d", &n, &m);
	for(int i=1;i<=n;++i) scanf("%s", G[i]+1);
	for(int i=1;i<=n;++i) scanf("%s", K[i]+1);
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			G2[i][j]=(G[i][j]=='.'?'X':'.'); // 求图A 的 补图
	int cnt=0, cnt2=0; //分别用来记录 把图A 转换 成图B 和 把图A的补图 转换成B 所需的转换次数
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			if(G[i][j]^K[i][j]) cnt++;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			if(G2[i][j]^K[i][j]) cnt2++;
	if(cnt<=n*m/2){
    
    //只要 转换次数符合条件 就输出
		for(int i=1;i<=n;++i) printf("%s\n", G[i]+1);
	}
	else{
    
    
		for(int i=1;i<=n;++i) printf("%s\n", G2[i]+1);
	}

	return 0;
}```

おすすめ

転載: blog.csdn.net/qq_45757639/article/details/111395644