在一个n x n的网格中填了一些大写字母,要求把剩下的格子也填上大写字母,使得任意两个相邻格子的字母不同。
如果有多个解,按要求从上到下、从左到右的顺序把所有格子连接起来的字典序最小。
分析:
1.“从上到下、从左到右”其实就是把每行看成一个字符串,然后从上到下连接,得到一个长长的字符串。所以我们只需要从左到右、从上到下依次给空格填上最小可能的字母即可。
2.这里直接暴力就可以。
#include<cstdio>
#include<cstring>
const int maxn = 10 + 5;
char grid[maxn][maxn];
int n;
int main()
{
int T;
scanf("%d", &T);
for (int kase = 1; kase <= T; kase++)
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%s", grid[i]);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (grid[i][j] == '.') //没有填过字母的
{
for (char ch = 'A'; ch <= 'Z'; ch++)
{
bool ok = true;
if (i > 0 && grid[i - 1][j] == ch)
ok = false;
if (i < n - 1 && grid[i + 1][j] == ch)
ok = false;
if (j > 0 && grid[i][j - 1] == ch)
ok = false;
if (j < n - 1 && grid[i][j + 1] == ch)
ok = false;
if (ok)
{
grid[i][j] = ch;
break;
}
}
}
printf("Case %d:\n", kase);
for (int i = 0; i < n; i++)
printf("%s\n", grid[i]);
}
return 0;
}