128 lines
2.6 KiB
C
128 lines
2.6 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
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;
|
|
} |