在一個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;
}