题意

每两个相连的点差要大于1。
思路
之前用我是一个点一个点的判断,但是老是错了,最后想了想还是要八个点一起判断。
代码
#include
#include
#include
int Map = {
{ 0, 1, 1, 1, 0, 0, 0, 0 },
{ 1, 0, 1, 0, 1, 1, 0, 0 },
{ 1, 1, 0, 1, 1, 1, 1, 0 },
{ 1, 0, 1, 0, 0, 1, 1, 0 },
{ 0, 1, 1, 0, 0, 1, 0, 1 },
{ 0, 1, 1, 1, 1, 0, 1, 1 },
{ 0, 0, 1, 1, 0, 1, 0, 1 },
{ 0, 0, 0, 0, 1, 1, 1, 0 } };
int visit , in , ans ; // 搜索标记、输入、答案
int sign; // sign==1时的输入数组直接用in[]
int ABS(int x){
if (x >= 0)
return x;
return -x;
}
int ok() // 判断当前搜索的一组是否符合
{
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
if (Map[i][j] && ABS(in[i] - in[j]) == 1)
return 0;
return 1;
}
void dfs(int a)
{
if (a == 8 && ok()){
sign++;
for (int i = 0; i<8; i++){
ans[i] = in[i];
}
}
if (sign > 1)
return;
if (in[a] != 0)
dfs(a + 1);
for (int i = 1; i <= 8; i++)
{
if (!visit[i]){
visit[i] = 1;
in[a] = i;
dfs(a + 1);
in[a] = 0;
visit[i] = 0;
}
}
}
int main()
{
int t, Case = 0;
scanf("%d", &t);
while (t--)
{
memset(visit, 0, sizeof(visit));
for (int i = 0; i < 8; i++){
scanf("%d", &in[i]);
visit[in[i]] = 1;
}
sign = 0;
dfs(0);
printf("Case %d: ", ++Case);
if (sign == 0)
puts("No answer");
else if (sign == 1){
for (int i = 0; i < 7; i++)
printf("%d ", ans[i]);
printf("%d\n", ans );
}
else
puts("Not unique");
}
return 0;
}