[CF1495C] Garden of the Sun

\(\text{Problem}:\)题目链接

\(\text{Solution}:\)

考虑在行 \(i=3k+2(1\leq i \leq n,k\in \N)\) 上把所有格子都涂黑,然后接下来就只用在相邻两个全黑行中涂色,使得黑格四连通即可。

对于两个非全黑行 \(i,i+1\),如果 \(s_{i,j}\)\(s_{i+1,j}\) 为黑,那么把 \(s_{i,j}\)\(s_{i+1,j}\) 都涂黑。对于 \(1\leq j \leq m\),如果存在 \(s_{i,j}\)\(s_{i+1,j}\) 都是黑色,即结束这两行的涂色。如果这两行全是白色,则随便选一个 \(j\),将 \(s_{i,j}\)\(s_{i+1,j}\) 涂黑即可。

这样可能最后会多出两行,和两个相邻全黑行之间的涂色方法一样处理即可。

\(\text{Code}:\)

#include <bits/stdc++.h>
#pragma GCC optimize(3)
#define int long long
#define ri register
#define mk make_pair
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define is insert
#define es erase
using namespace std; const int N=510;
inline int read()
{
	int s=0, w=1; ri char ch=getchar();
	while(ch<'0'||ch>'9') { if(ch=='-') w=-1; ch=getchar(); }
	while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48), ch=getchar();
	return s*w;
}
int n,m;
char s[N][N];
inline void Output()
{
	for(ri int i=1;i<=n;i++) printf("%s\n",s[i]+1);
}
signed main()
{
	for(ri int T=read();T;T--)
	{
		n=read(), m=read();
		for(ri int i=1;i<=n;i++) scanf("%s",s[i]+1);
		if(n==1)
		{
			for(ri int i=1;i<=m;i++) s[1][i]='X';
			Output();
			continue;
		}
		int now=2;
		while(now<=n)
		{
			for(ri int i=1;i<=m;i++) s[now][i]='X';
			if(now>2)
			{
				int flg=0;
				for(ri int i=1;i<=m;i++) if(s[now-1][i]=='X'&&s[now-2][i]=='X') { flg=1; break; }
				if(flg) { now+=3; continue; }
				flg=0;
				for(ri int i=1;i<=m;i++)
				{
					if(s[now-1][i]=='X'||s[now-2][i]=='X')
					{
						s[now-1][i]=s[now-2][i]='X';
						flg=1;
						break;
					}
				}
				if(!flg) s[now-1][1]=s[now-2][1]='X';
			}
			now+=3;
		}
		if(now==n+1&&n>=2)
		{
			for(ri int i=1;i<=m;i++) if(s[n][i]=='X') s[n-1][i]='X';
		}
		Output();
	}
	return 0;
}
posted @ 2021-03-12 18:01  zkdxl  阅读(132)  评论(0编辑  收藏  举报