• 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 }
  • 相关阅读:
    第二阶段冲刺报告(三)
    第二阶段冲刺报告(二)
    第二阶段冲刺报告(一)
    课程改进意见
    用户体验
    返回一个二维整数数组中最大联通子数组的和
    《你的灯亮着吗》阅读笔记三 ——谁的问题
    《你的灯亮着吗》阅读笔记二 ——什么是真正的问题
    《你的灯亮着吗》阅读笔记一 —— 问题是什么?
    我爱淘冲刺阶段站立会议2每天任务6
  • 原文地址:https://www.cnblogs.com/algorithms/p/2497442.html
Copyright © 2020-2023  润新知