HDU 2514 Another Eight Puzzle 【dfs】


传送门:HDU 2514


Another Eight Puzzle
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Problem Description
Fill the following 8 circles with digits 1~8,with each number exactly once . Conntcted circles cannot be filled with two consecutive numbers.
There are 17 pairs of connected cicles:
A-B , A-C, A-D
B-C, B-E, B-F
C-D, C-E, C-F, C-G
D-F, D-G
E-F, E-H
F-G, F-H
G-H
在这里插入图片描述
Filling G with 1 and D with 2 (or G with 2 and D with 1) is illegal since G and D are connected and 1 and 2 are consecutive .However ,filling A with 8 and B with 1 is legal since 8 and 1 are not consecutive .
In this problems,some circles are already filled,your tast is to fill the remaining circles to obtain a solution (if possivle).

Input
The first line contains a single integer T(1≤T≤10),the number of test cases. Each test case is a single line containing 8 integers 0~8,the numbers in circle A~H.0 indicates an empty circle.

Output
For each test case ,print the case number and the solution in the same format as the input . if there is no solution ,print “No answer”.If there more than one solution,print “Not unique”.

Sample Input
3
7 3 1 4 5 8 0 0
7 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0

Sample Output
Case 1: 7 3 1 4 5 8 6 2
Case 2: Not unique
Case 3: No answer



水题,就是麻烦了点。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
int a[10],ans[10];
int t;
int vis[10],color[10];
int mp[10][10];
int sum=0;
bool judge(int x)
{
  for(int i=1;i<x;i++)
  {
    if(mp[x][i]&&abs(a[x]-a[i])==1)
      return false;
  }
  return true;
}
void dfs(int x)
{
  if(x==9)
  {
    for(int i=1;i<=8;i++)
    {
      ans[i]=a[i];
    }
    sum++;
    return;
  }
  if(sum>=2) return;
  if(vis[x]==2)
    dfs(x+1);
  for(int i=1;i<=8;i++)
  {
    if(!color[i])
    {
      a[x]=i;
      color[i]=1;
      if(judge(x))
        dfs(x+1);
      a[x]=0;
      color[i]=0;
    }
  }
}
int main()
{
  mp[1][2]=mp[1][3]=mp[1][4]=1;
  mp[2][1]=mp[3][1]=mp[4][1]=1;
  mp[2][3]=mp[2][5]=mp[2][6]=1;
  mp[3][2]=mp[5][2]=mp[6][2]=1;
  mp[3][4]=mp[3][5]=mp[3][6]=mp[3][7]=1;
  mp[4][3]=mp[5][3]=mp[6][3]=mp[7][3]=1;
  mp[4][6]=mp[4][7]=1;
  mp[6][4]=mp[7][4]=1;
  mp[5][6]=mp[5][8]=1;
  mp[6][5]=mp[8][5]=1;
  mp[6][7]=mp[6][8]=1;
  mp[7][6]=mp[8][6]=1;
  mp[7][8]=mp[8][7]=1;
  int ca=0;
  scanf("%d",&t);
  while(t--)
  {
    sum=0;
    memset(vis,0,sizeof(vis));
    memset(color,0,sizeof(color));
    memset(ans,0,sizeof(ans));
    for(int i=1;i<=8;i++)
    {
      scanf("%d",&a[i]);
      if(a[i]!=0)
      {
        vis[i]=2;
        color[a[i]]=1;
      }
    }
    dfs(1);
    printf("Case %d: ",++ca);
    if(sum==1)
    {
      for(int i=1;i<=8;i++)
      {
        printf("%d%c",ans[i],i==8?'\n':' ');
      }
    }
    else if(sum>=2)
      printf("Not unique\n");
    else printf("No answer\n");
  }
  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值