Title

【CF】B. Mine Sweeper II

B. Mine Sweeper II

戳我

思路

地雷格向非地雷格发出的数字等于非地雷格向地雷格接收到的数字也将等于地雷格从非地雷格回收到的数字总和。

(根据“数字”守恒)

将非地雷格转换成地雷格可以看成是把此时该地雷格上的数字一一归还给相应的非地雷格,而地雷格在接收到周围的原本的非地雷格归还的数字后将变成用来接收数字的非地雷格。

至于[m*n/2]操作次数能够完成,以上的变换是互补的,如果说一种方案的操作次数是大于[m*n/2],那么另外一种方案的所需的操作次数将少于这个变换次数。

补题代码

#include <bits/stdc++.h>
#define MEM(a,x) memset(a,x,sizeof(a))
#define W(a) while(a)
#define gcd(a,b) __gcd(a,b)
#define pi acos(-1.0)
#define PII pair<int,int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define MAX 1000005
#define MOD 1000000007
#define INF 0x3f3f3f3f
#define lowbit(x) (x&-x)
using namespace std;
int n,m;

int main()
{
	scanf("%d%d",&n,&m);
	char g[2][n+1][m+1],comp[n+1][m+1];
	repd(i,1,n)
	    repd(j,1,m)
	    {
	    	cin>>g[0][i][j];
	    	g[1][i][j]=g[0][i][j]=='X'?'.':'X';
		}
		
	repd(i,1,n)
	    repd(j,1,m)
		    cin>>comp[i][j];

	    
  
	int cnt[2]={0};
	repd(i,1,n)
	    repd(j,1,m)
        {
            if(g[0][i][j]^comp[i][j]) cnt[0]++;
			if(g[1][i][j]^comp[i][j]) cnt[1]++;	
		}	    
	
	bool flag=1;
	repd(i,0,1)
	{
		if(cnt[i]<=(n*m)/2)
	    {
	    	flag=0;
	    	repd(j,1,n)
	    	{
	    		repd(k,1,m)
	    		    printf("%c",g[i][j][k]);
	    	    printf("\n");
			}
			break;
		}
	}
	if(flag)cout<<-1<<endl;
    return 0;
}

posted @ 2021-08-09 10:03  BeautifulWater  阅读(75)  评论(0编辑  收藏  举报