#include #include int state = 0; int v[16]; char labels[4][16] = {"农夫", "狼", "羊", "菜"}; int re[16]; int xx[16]; int k = 0; void pt(int command, int state) { int *f = malloc(sizeof(int) * 4); for (int i = 0; i < 4; i++) { f[i] = (state >> i) & 1; } if (command == 0) { printf("农夫自己过河\n"); } else if (command == 1) { printf("带 狼 过河\n"); } else if (command == 2) { printf("带 羊 过河\n"); } else if (command == 3) { printf("带 菜 过河\n"); } printf("A > "); for (int i = 0; i < 4; i++) { if (f[i] == 1) { printf("%s ", labels[i]); } } printf("\n"); printf("B > "); for (int i = 0; i < 4; i++) { if (f[i] == 0) { printf("%s ", labels[i]); } } printf("\n---------------------\n"); } int validate_state(int state) { int *f = malloc(sizeof(int) * 4); for (int i = 0; i < 4; i++) { f[i] = (state >> i) & 1; // printf("%d ", f[i]); } // printf("\n"); if (!f[1] ^ f[2] && f[0] ^ f[1]) { return 0; } else if (!f[2] ^ f[3] && f[0] ^ f[2]) { return 0; } else { return 1; } } int trans(int x, int undo) { // 0 表示农夫自己过河 // 1 表示带狼过河 // 2 表示带羊过河 // 3 表示带菜过河 int tmp_state = state; if (x == 1) { tmp_state = state ^ 3; } else if (x == 2) { tmp_state = state ^ 5; } else if (x == 3) { tmp_state = state ^ 9; } else { tmp_state = state ^ 1; } // pt(state); // printf("%d > ", x); // pt(tmp_state); if (undo) { v[tmp_state] = 0; state = tmp_state; re[--k] = 0; xx[k] = 0; return 1; } if (validate_state(tmp_state) == 0) { return 0; } if (v[tmp_state] == 0) { v[tmp_state] = 1; state = tmp_state; xx[k] = x; re[k++] = state; return 1; } return 0; } void dfs() { // printf(">> %d\n", state); if (state == 15) { for (int i = 0; i < k; i++) { pt(xx[i], re[i]); } printf("\n"); return; } if (trans(0, 0)) { dfs(); trans(0, 1); } if (trans(1, 0)) { dfs(); trans(1, 1); } if (trans(2, 0)) { dfs(); trans(2, 1); } if (trans(3, 0)) { dfs(); trans(3, 1); } } int main() { // freopen("data.in", "r", stdin); // freopen("data.out", "w", stdout); v[0] = 1; dfs(); return 0; }