直接枚举每个位置'A' 到'Z'就可以过了.
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 11;
int n;
char grid[maxn][maxn];
bool ok(int i, int j, char ch){
if(i - 1 >= 0 && grid[i - 1][j] == ch)return false;
if(i + 1 < n && grid[i + 1][j] == ch )return false;
if(j - 1 >= 0 && grid[i][j - 1] == ch) return false;
if(j + 1 < n && grid[i][j + 1] == ch) return false;
return true;
}
int main(){
int T, cas = 1;
scanf("%d", &T);
while(T--){
scanf("%d\n", &n);
for(int i = 0; i < n ;++i){
gets(grid[i]);
}
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j){
if(grid[i][j] != '.')continue;
char ch;
for(ch = 'A'; ch <= 'Z'; ++ch){
if(ok(i, j, ch))break;
}
grid[i][j] = ch;
}
}
printf("Case %d:\n", cas++);
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j){
printf("%c", grid[i][j]);
}
printf("\n");
}
}
return 0;
}