典型的回溯,这题我一拖再拖,拖了好几天,然后觉得自己写不出来。可是今天搜了一下,答案是如此简短明了,我真的很诧异,难道我真的不行?好吧,我是一个回溯都没写过,所以才会这么力不从心,决定做几题练一练。

 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 }