HDOJ搜索专题之Another Eight Puzzle

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 }

 

你可能感兴趣的:(搜索)