这是一道很多恶心细节的题目。在做完了这道题后给了我很多反思。为什么我的DFS总是不能一次的A过。。。现在发现代码的规范化是很有必要的。今天要学会规范自己的代码。。。这道题先不说它的其他的常规的坑,那些在DISCUSS里面就可以找到。对于我来说,这题之所以调了这么久还在于回溯本身的理解。只是在递归的时候始终想通过人为的设置条件让其递归返回。其实搜索都是有界的。。。。这个简单的事实被我忽略了很多次。但是好歹它是被我调出来了。。。真是囧啊~~~~明天的排位赛,照这样的态势,可能会死得很是难看的啊~~~~~
附上代码:
#include<stdio.h>
#include<string.h>
int dx[8]={-1,1,-2,2,-2,2,-1,1};
int dy[8]={-2,-2,-1,-1,1,1,2,2};
int a[70][70],fx[70][70],fy[70][70];
int p,q,ans=1,impossible=0,count,k=1;
void pr(int i,int j){
if(fx[i][j]==-1 && fy[i][j]==-1){
printf("Scenario #%d:\nA1",k++);
}
else{
pr(fx[i][j],fy[i][j]);
printf("%c%d",j+'A',i+1);
}
}
void find(int x,int y){
int i,j,xn,yn,flag=0;
if(count==p*q){
pr(x,y);
ans=0;
}
else{
if(ans==0){
return;}
else{
for(i=0;i<=7;i++){
xn=dx[i]+x;
yn=dy[i]+y;
if(xn>=0 && xn<=p-1 && yn>=0 && yn<=q-1){
if(a[xn][yn]==0){
count++;
flag=1;
a[xn][yn]=1;
fx[xn][yn]=x;
fy[xn][yn]=y;
find(xn,yn);
a[xn][yn]=0;
count--;
}
}
}
}
}
}
main(){
int t;
scanf("%d",&t);
while(t--){
memset(a,0,sizeof(a));
count=1;
ans=1;
impossible=0;
scanf("%d%d",&p,&q);
a[0][0]=1;
fx[0][0]=-1;
fy[0][0]=-1;
find(0,0);
if(ans)
printf("Scenario #%d:\nimpossible",k++);
printf("\n\n");
}
}