//简单的DFS,题目要求都给你了,照着写就好了
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
#define N 11
#define M 210
using namespace std;
int n,m,t,sumf;
int map[N],ans[N];
bool vis[N][N],used[N];
void init()
{
memset(vis,0,sizeof(vis));
vis[1][2]=vis[1][3]=vis[1][4]=1;
vis[2][1]=vis[3][1]=vis[4][1]=1;
vis[2][3]=vis[2][5]=vis[2][6]=1;
vis[3][2]=vis[5][2]=vis[6][2]=1;
vis[3][4]=vis[3][5]=vis[3][6]=vis[3][7]=1;
vis[4][3]=vis[5][3]=vis[6][3]=vis[7][3]=1;
vis[4][6]=vis[4][7]=1;
vis[6][4]=vis[7][4]=1;
vis[5][6]=vis[5][8]=1;
vis[6][5]=vis[8][5]=1;
vis[6][7]=vis[6][8]=vis[7][8]=1;
vis[7][6]=vis[8][6]=vis[8][7]=1;
}
bool isok(int id,int val)
{
for(int i=1;i<9;i++)
{
if(i==id) continue;
if(vis[id][i]&&ans[i])
{
int k=abs(val-ans[i]);
if(k<2) return 1;
}
}
return 0;
}
void dfs(int id)
{
if(id==9)
{
for(int j=1;j<9;j++) map[j]=ans[j];
m++;
return ;
}
if(ans[id]) dfs(id+1);
else
{
for(int i=1;i<9;i++)
{
if(used[i]||isok(id,i)) continue;
ans[id]=i,used[i]=1;
dfs(id+1);
ans[id]=0,used[i]=0;
}
}
}
int main()
{
int cases=1;
init();
scanf("%d",&t);
while(t--)
{
memset(used,0,sizeof(used));
for(int i=1;i<=8;i++)
{
scanf("%d",&ans[i]);
used[ans[i]]=1;
}
m=0;
dfs(1);
printf("Case %d:",cases++);
if(m==0) puts(" No answer");
else if(m>1) puts(" Not unique");
else
{
for(int j=1;j<9;j++) printf(" %d",map[j]);
puts("");
}
}
return 0;
}
hdu2514---DFS
最新推荐文章于 2021-03-28 21:19:39 发布