Problem: Fill the Square
Description: 有一个矩阵,当中的元素是大写字母,但是有个前提,相邻的位置大写字母不能相同,现在这个矩阵中的某些位置已近有字母了,要你把这个矩阵填满,并且保证字典序最小。
Solution: 简单
DFS
。但是要注意的是,如果我这种做法超时了,那就把空的位置存到一个数组中,这样
dfs
时就可以减少栈的空间使用。
Code(JAVA):
import java.util.*;
public class Main{
Scanner cin=new Scanner(System.in);
static final int M=10+5;
static final int[] dirx=new int[]{0,0,1,-1};
static final int[] diry=new int[]{1,-1,0,0};
boolean f;
void dfs(int x,int y,int n,char[][] map){
if(x==n+1&&y==1){
f=true;
return ;
}
if(f)
return ;
int Y=(y+1>n? 1:y+1);
int X=(Y==1? x+1:x);
if(map[x][y]!='.'){
dfs(X,Y,n,map);
return ;
}
for(char c='A';c<='Z';c++){
int m=0;
for(int i=0;i<4;i++){
int tx=x+dirx[i];
int ty=y+diry[i];
if(map[tx][ty]!=c)
++m;
}
if(m==4){
map[x][y]=c;
dfs(X,Y,n,map);
if(f)
return ;
map[x][y]='.';
}
}
}
Main(){
int K=1;
int N=cin.nextInt();
while(N-->0){
int n=cin.nextInt();
char[][] map=new char[M][M];
for(int i=0;i<M;i++)
for(int j=0;j<M;j++)
map[i][j]='.';
for(int i=1;i<=n;i++){
char[] tmp=cin.next().toCharArray();
for(int j=1;j<=n;j++)
map[i][j]=tmp[j-1];
}
f=false;
dfs(1,1,n,map);
System.out.println("Case "+(K++)+":");
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
System.out.print(map[i][j]);
System.out.println();
}
}
}
public static void main(String[] args){
new Main();
}
}