典型的搜索题目,将1,2,3,4...8填入上图A,B,C...H中,相邻的字母中的两个数不能相邻。
现给定一种初始状态,求能否完成上述要求,若方案唯一,则依次输出完成后A,B,C...H中的数。
View Code
1 #include <stdio.h> 2 #include <string.h> 3 #include <vector> 4 #define N 9 5 using namespace std; 6 vector<int> g[N]; 7 int a[N],vis[N],ans[N]; 8 void init() 9 { 10 g[1].push_back(2); g[2].push_back(1); 11 g[1].push_back(3); g[3].push_back(1); 12 g[1].push_back(4); g[4].push_back(1); 13 g[2].push_back(3); g[3].push_back(2); 14 g[2].push_back(5); g[5].push_back(2); 15 g[2].push_back(6); g[6].push_back(2); 16 g[3].push_back(4); g[4].push_back(3); 17 g[3].push_back(5); g[5].push_back(3); 18 g[3].push_back(6); g[6].push_back(3); 19 g[3].push_back(7); g[7].push_back(3); 20 g[4].push_back(6); g[6].push_back(4); 21 g[4].push_back(7); g[7].push_back(4); 22 g[5].push_back(6); g[6].push_back(5); 23 g[5].push_back(8); g[8].push_back(5); 24 g[6].push_back(7); g[7].push_back(6); 25 g[6].push_back(8); g[8].push_back(6); 26 g[7].push_back(8); g[8].push_back(7); 27 } 28 bool is_consecutive(int a,int b) 29 { 30 if(a==0 || b==0) return false; 31 if(a+1==b || b+1==a) return true; 32 else return false; 33 } 34 int dfs(int k) 35 { 36 int i,j,n,ret=0; 37 bool f; 38 if(k>8) 39 { 40 for(i=1;i<=8;i++) ans[i]=a[i]; 41 return 1; 42 } 43 if(a[k]) return dfs(k+1); 44 for(i=1;i<=8;i++) 45 { 46 if(vis[i]) continue; 47 f=true; 48 for(n=0;n<g[k].size();n++) 49 { 50 j=a[g[k][n]]; 51 if(is_consecutive(i,j)) 52 { 53 f=false; 54 break; 55 } 56 } 57 if(f==false) continue; 58 a[k]=i; 59 vis[i]=1; 60 ret+=dfs(k+1); 61 a[k]=0; 62 vis[i]=0; 63 } 64 return ret; 65 } 66 int main() 67 { 68 int t,i,flag,kase=0; 69 init(); 70 scanf("%d",&t); 71 while(t--) 72 { 73 memset(vis,0,sizeof(vis)); 74 for(i=1;i<=8;i++) 75 { 76 scanf("%d",&a[i]); 77 vis[a[i]]=1; 78 } 79 flag=dfs(1); 80 printf("Case %d: ",++kase); 81 if(flag==1) 82 { 83 for(i=1;i<8;i++) printf("%d ",ans[i]); 84 printf("%d\n",ans[8]); 85 } 86 else printf(flag?"Not unique\n":"No answer\n"); 87 } 88 return 0; 89 }