简单的贪心。
保证每次选取的是A---Z最小的字母就行,因为每一个字母只有上下左右四个字母,所以26个字母永远是够用的,不需要回溯,循环到底就可以。
#include <cstdlib>
#include <iostream>
#include <stdio.h>
using namespace std;
const int MAX = 10 +5;
char sq[MAX][MAX];
int main(int argc, char *argv[])
{
int t,n,kase = 1;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i = 0; i < n; i++)scanf("%s",sq[i]);
for(int col = 0; col < n; col++)
for(int row = 0; row < n; row++)
{
if(sq[row][col] == '.')
for(char c = 'A'; c <= 'Z'; c++)
{
if(row > 0 && sq[row - 1][col] == c)continue;
if(row < n - 1 && sq[row + 1][col] == c)continue;
if(col > 0 && sq[row][col - 1] == c)continue;
if(col < n - 1 && sq[row][col + 1] == c)continue;
sq[row][col] = c;
break;
}
}
printf("Case %d:\n",kase++);
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)putchar(sq[i][j]);
puts("");
}
}
//system("PAUSE");
return EXIT_SUCCESS;
}