data-structure-experiments/2/main.c

106 lines
2.0 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 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;
}