爆搜就可以过,不过我用了迭代加深。
注意每个操作最多进行4次

#include <cstdio> #include <cstdlib> using namespace std; #define MAX_ANS 100 int clock[9]; char move[9][10] = {"ABDE", "ABC", "BCEF", "ADG", "BDEFH", "CFI", "DEGH", "GHI", "EFHI"}; int ans[MAX_ANS], ans_num; void input() { for (int i = 0; i < 9; i++) scanf("%d", &clock[i]); } void output() { printf("%d", ans[0]); for (int i = 1; i < ans_num; i++) printf(" %d", ans[i]); putchar(' '); } bool ok() { for (int i = 0; i < 9; i++) if (clock[i]) return false; return true; } void make(char* move, int value) { for (int i = 0; move[i]; i++) { int index = move[i] - 'A'; clock[index] = (clock[index] + value + 4) % 4; } } void dfs(int step, int limit, int move_index) { if (step > limit) return; if (ok()) { output(); exit(0); } for (int i = move_index; i < 9; i++) { for (int j = 0; j < 3; j++) { make(move[i], 1); ans[ans_num++] = i + 1; dfs(step + 1, limit, i + 1); } ans_num -= 3; make(move[i], -3); } } int main() { input(); for (int i = 0; i < 100; i++) { ans_num = 0; dfs(0, i, 0); } return 0; }