该题直接暴力即可,因为一定有解,所以对每一个空格,尽可能的放置字典序小的字母就行了。
虽然用dfs写的,但是时间复杂度是显然的,最高只有O(n*n*26)。
细节参加代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 100000000;
const int maxn = 50 + 5;
int T,n,kase = 0;
char s[maxn][maxn];
bool dfs(int r, int c) {
if(r == n && c == n+1) {
for(int i=1;i<=n;i++) printf("%s\n",s[i]+1);
return true;
}
if(c == n+1) { r++; c = 1; }
for(int i=r;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(s[i][j] == '.') {
for(int k=0;k<26;k++) {
char cc = 'A'+k;
bool ok = true;
if(i > 1 && s[i-1][j] == cc) ok = false;
if(j > 1 && s[i][j-1] == cc) ok = false;
if(i < n && s[i+1][j] == cc) ok = false;
if(j < n && s[i][j+1] == cc) ok = false;
if(ok) {
s[i][j] = cc;
if(dfs(i,j+1)) return true;
}
}
}
if(i == n && j == n) if(dfs(n,n+1)) return true;
}
}
return false;
}
int main() {
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%s",s[i]+1);
}
printf("Case %d:\n",++kase);
dfs(1,1);
}
return 0;
}