典型的回溯,这题我一拖再拖,拖了好几天,然后觉得自己写不出来。可是今天搜了一下,答案是如此简短明了,我真的很诧异,难道我真的不行?好吧,我是一个回溯都没写过,所以才会这么力不从心,决定做几题练一练。
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int q[25]; 5 int s[25][4]; 6 int num[25]; 7 int flag,n,l; 8 void dfs(int len) 9 { 10 if(flag) 11 return; 12 if(len == n * n) 13 { 14 flag = 1; 15 return; 16 } 17 int i; 18 for(i = 0;i < l;i++) 19 { 20 if(num[i] > 0) 21 { 22 if(len % n != 0) 23 { 24 if(s[i][3] != s[q[len - 1]][1]) 25 continue; 26 } 27 if(len / n != 0) 28 { 29 if(s[i][0] != s[q[len - n]][2]) 30 continue; 31 } 32 q[len] = i; 33 num[i]--; 34 dfs(len + 1); 35 if(flag) 36 return; 37 num[i]++; 38 } 39 } 40 return; 41 } 42 int main() 43 { 44 int m = 0; 45 while(cin>>n, n) 46 { 47 memset(q,0,sizeof(q)); 48 memset(num,0,sizeof(num)); 49 int i,j,a,b,c,d; 50 l = 0; 51 for(i = 0;i < n * n;i++) 52 { 53 cin>>a>>b>>c>>d; 54 for(j = 0;j < l;j++) 55 { 56 if(s[j][0] == a && s[j][1] == b && s[j][2] == c && s[j][3] == d) 57 { 58 num[j]++; 59 break; 60 } 61 } 62 if(j >= l) 63 { 64 s[l][0] = a; 65 s[l][1] = b; 66 s[l][2] = c; 67 s[l][3] = d; 68 num[l] = 1; 69 l++; 70 } 71 } 72 flag = 0; 73 dfs(0); 74 if(m) 75 cout<<endl; 76 cout<<"Game "<<++m<<": "; 77 if(flag) 78 cout<<"Possible"<<endl; 79 else 80 cout<<"Impossible"<<endl; 81 } 82 return 0; 83 }