题意:每两个相连的点差要大于1。
代码:
#include <stdio.h> #include <string.h> #include <math.h> int Map[8][8] = { { 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[10], in[10], ans[10]; // 搜索标记、输入、答案 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[7]); } else puts("Not unique"); } return 0; }