HDOJ搜索专题之Another Eight Puzzle

典型的搜索题目,将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 }
原文地址:https://www.cnblogs.com/algorithms/p/2497442.html