CF1863D Two-Colored Dominoes

发布时间 2023-08-31 16:32:42作者: One_JuRuo

思路

首先考虑保证每行的黑白数量一样,横着的一定是贡献一黑一白,所以只用考虑竖着的,同理竖着的任何方案也不会影响横着的要求。

因为两个同行的竖着的颜色可以互换,所以在满足条件的情况下,谁黑谁白无所谓。

考虑从上往下满足,因为 D 的格子已经在上一行中确定了,所以可以在上一行时就先把这一行的黑白初始数量确定,然后考虑这一行的 U,如果缺白的就放白的,如果缺黑的就放黑的,顺便把下一排的颜色也确定了,如果某行无法使黑白数量一样,就一定无解。

然后再从左到右一样的判断就行了。

AC code

#include <bits/stdc++.h>
using namespace std;
int T,n,m,num[505][2],flag;
char ch[505][505];
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&m),flag=0;
		for(int i=1;i<=n;++i) scanf("%s",ch[i]+1);
		memset(num,0,sizeof(num));
		for(int i=1;i<=n;++i)
		{
			for(int j=1;j<=m;++j)
			{
				if(ch[i][j]=='U')
				{
					if(num[i][0]<=num[i][1]) ++num[i][0],ch[i][j]='B',++num[i+1][1],ch[i+1][j]='W';
					else ++num[i][1],ch[i][j]='W',++num[i+1][0],ch[i+1][j]='B';
				}
			}
			if(num[i][0]!=num[i][1]){flag=1;break;}
		}
		if(flag){printf("-1\n");continue;}
		memset(num,0,sizeof(num));
		for(int j=1;j<=m;++j)
		{
			for(int i=1;i<=n;++i)
			{
				if(ch[i][j]=='L')
				{
					if(num[j][0]<=num[j][1]) ++num[j][0],ch[i][j]='B',++num[j+1][1],ch[i][j+1]='W';
					else ++num[j][1],ch[i][j]='W',++num[j+1][0],ch[i][j+1]='B';
				}
			}
			if(num[j][0]!=num[j][1]){flag=1;break;}
		}
		if(flag) printf("-1\n");
		else
		{
			for(int i=1;i<=n;++i){for(int j=1;j<=m;++j) printf("%c",ch[i][j]);puts("");}
		}
	}
	return 0;
}