题目:http://acm.hdu.edu.cn/showproblem.php?pid=2514
就是DFS+回溯。。。我蠢蠢的把所有状态枚举了。。
但是在输出处理上没注意。。。WA了几次
下面是AC代码:
#include<iostream> #include<cstring> using namespace std; int a[10],b[10]; int mark[10]; int flag; int judge(int num,int n) { if(n==1&&num==2) return 1; if(n==8&&num==7) return 1; if((n>1&&n<8)&&(num==(n-1)||num==(n+1))) return 1; return 0; } int cheak(int pos ,int n) { int i; if(pos==1) { for(i=2;i<=4;i++) if(judge(a[i],n)) return 0; return 1; } if(pos==2) { if(judge(a[1],n)) return 0; if(judge(a[3],n)) return 0; if(judge(a[5],n)) return 0; if(judge(a[6],n)) return 0; return 1; } if(pos==3) { if(judge(a[1],n)) return 0; if(judge(a[2],n)) return 0; for(i=4;i<=7;i++) if(judge(a[i],n)) return 0; return 1; } if(pos==4) { if(judge(a[1],n)) return 0; if(judge(a[3],n)) return 0; for(i=6;i<=7;i++) if(judge(a[i],n)) return 0; return 1; } if(pos==5) { if(judge(a[2],n)) return 0; if(judge(a[3],n)) return 0; if(judge(a[6],n)) return 0; if(judge(a[8],n)) return 0; return 1; } if(pos==6) { for(i=2;i<=5;i++) if(judge(a[i],n)) return 0; return 1; for(i=7;i<=8;i++) if(judge(a[i],n)) return 0; return 1; } if(pos==7) { if(judge(a[3],n)) return 0; if(judge(a[4],n)) return 0; if(judge(a[6],n)) return 0; if(judge(a[8],n)) return 0; return 1; } if(pos==8) { for(i=5;i<=6;i++) if(judge(a[i],n)) return 0; return 1; } } void DFS(int pos) { int i; if(pos>8) { flag++; for(i=1;i<=8;i++) b[i]=a[i]; return ; } if(a[pos]==0) { for( i=1;i<=8;i++) { if(!mark[i]&&cheak(pos,i)) { mark[i]=1; a[pos]=i; DFS(pos+1); mark[i]=0; a[pos]=0; } } } else DFS(pos+1); } int main() { int t,i,j; cin>>t; for(j=1;j<=t;j++) { memset(mark,0,sizeof(mark)); for(i=1;i<=8;i++) { cin>>a[i]; mark[a[i]]=1; } flag=0; DFS(1); if(!flag) { printf("Case %d: ",j); printf("No answer\n"); } else if(flag>1) { printf("Case %d: ",j); printf("Not unique\n"); } else { printf("Case %d: ",j); printf("%d",b[1]); for(i=2;i<=8;i++) printf(" %d",b[i]); printf("\n"); } } return 0; }