分析:
1 题目给定一个n*n的地图,这个地图上面是一些空格和大写字母,现在要求把这个地图填满并且使得这个地图有最小的字典序
2 很明显的搜索题,我们只要通过枚举这个地图找到一个空格就进行dfs填充,最后得到的肯定是最小的字典序
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 15;
char map[N][N];
int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
//判断当前字母是否满足
bool ok(int x , int y , int n , char ch){
bool mark = true;
for(int i = 0 ; i < 4 ; i++){
int tmpx = x+dir[i][0];
int tmpy = y+dir[i][1];
if(tmpx >= 0 && tmpy < n && map[tmpx][tmpy] == ch)
mark = false;
}
return mark;
}
void dfs(int x , int y , int n){
if(map[x][y] != '.')
return;
for(int i = 65 ; i < 65+26 ; i++){
if(ok(x , y , n , i)){
map[x][y] = i;
break;
}
}
for(int i = 0 ; i < 4 ; i++){
int tmpx = x+dir[i][0];
int tmpy = y+dir[i][1];
if(tmpx >= 0 && tmpy < n)
dfs(tmpx , tmpy , n);
}
}
void solve(int n){
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < n ; j++){
if(map[i][j] == '.')
dfs(i , j , n);
}
}
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < n ; j++)
printf("%c" , map[i][j]);
printf("\n");
}
}
int main(){
int n , T , Case = 1;
scanf("%d" , &T);
while(T--){
scanf("%d%*c" , &n);
for(int i = 0 ; i < n ; i++)
gets(map[i]);
printf("Case %d:\n" , Case++);
solve(n);
}
return 0;
}