传送门:HDU 2514
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;
}