From bfebfc9c4a5f1265491a569f7e4927552fb9555f Mon Sep 17 00:00:00 2001 From: Luthics Date: Tue, 28 Nov 2023 15:20:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AC=AC=E4=BA=8C=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 2/main.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 .gitignore create mode 100644 2/main.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..adb36c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.exe \ No newline at end of file diff --git a/2/main.c b/2/main.c new file mode 100644 index 0000000..97e9e75 --- /dev/null +++ b/2/main.c @@ -0,0 +1,106 @@ +#include +#include + +int state = 0; +int v[16]; +char labels[4][16] = {"农夫", "狼", "羊", "菜"}; +int re[16]; +int xx[16]; +int k = 0; + +void pt(int state) { + for (int i = 0; i < 4; i++) { + printf("%d ", (state >> i) & 1); + } + printf("\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++) { + printf("%d > ", xx[i]); + pt(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; +} \ No newline at end of file