|
这题很有意思哇。给出一个这样的东西: A---+ | +---:\ : >o---:\ +---:/ : )---? | C--o:/ B---+
其中: :\ :\ -:\ -o:\ A-o:\ : ) : > : )- : )o- : )o-? :/ :/ -:/ --:/ B--:/ AND gate OR gate Gate with inputs An inverted top input Two logic input and an inverted output and the output
然后叫你分析它的输出。 其实哥比较喜欢这种有创意的题,做这种题代码也写得比较有意思。
#include <stdio.h> #include <string.h>
struct node { char type, n[3]; struct node *child[2]; }; struct node nodes[128], *root; int nodes_cnt; char map[128][128], input[32]; int W[128], H;
int in_range(int dx, int dy) { return !(dx < 0 || dx >= W[dy] || dy < 0 || dy >= H); }
void follow_path(int x, int y, struct node **p_node);
int find_node(int x, int y, struct node **p_node) { struct node *t;
if (map[y][x] >= 'A' && map[y][x] <= 'Z') { t = &nodes[nodes_cnt++]; t->type = map[y][x]; *p_node = t; return 1; } if (map[y][x] == 'o') x--; if (map[y][x] == ')' || map[y][x] == '>') { t = &nodes[nodes_cnt++]; memset(t, 0, sizeof(*t)); t->type = map[y][x]; *p_node = t; if (in_range(x - 3, y - 1) && map[y - 1][x - 3] == 'o') t->n[0] = 1; if (in_range(x - 3, y + 1) && map[y + 1][x - 3] == 'o') t->n[1] = 1; if (in_range(x + 1, y) && map[y][x + 1] == 'o') t->n[2] = 1; follow_path(x - 3, y - 1, &t->child[0]); follow_path(x - 3, y + 1, &t->child[1]); return 1; }
return 0; }
void follow_path(int x, int y, struct node **p_node) { int i, dx, dy; const struct { char ch; int dx, dy; } dir[4] = { {'-', -1, 0}, {'-', 1, 0}, {'|', 0, 1}, {'|', 0, -1} };
while (1) { for (i = 0; i < 4; i++) { dx = x + dir[i].dx; dy = y + dir[i].dy; if (!in_range(dx, dy)) continue; if (map[dy][dx] == dir[i].ch || map[dy][dx] == '+') break; if (find_node(dx, dy, p_node)) return ; } if (i == 4) break; map[y][x] = '.'; x = dx; y = dy; }
*p_node = NULL; }
int calc(struct node *t) { if (!t) return 0; if (t->type >= 'A' && t->type <= 'Z') return input[t->type - 'A'] - '0'; if (t->type == ')') return ((calc(t->child[0]) ^ t->n[0]) & (calc(t->child[1]) ^ t->n[1])) ^ t->n[2]; if (t->type == '>') return ((calc(t->child[0]) ^ t->n[0]) | (calc(t->child[1]) ^ t->n[1])) ^ t->n[2]; return 0; }
void find_root() { int x, y;
root = NULL; for (y = 0; y < H; y++) for (x = 0; x < W[y]; x++) { if (map[y][x] == '?') { follow_path(x, y, &root); return ; } } }
int main() {
freopen("e:\\test\\in.txt", "r", stdin);
while (1) { nodes_cnt = 0; H = 0; while (1) { if (!fgets(map[H], sizeof(map[H]), stdin)) return 0; if (map[H][0] == '*') break; W[H] = strlen(map[H]); H++; } find_root(); while (1) { fgets(input, sizeof(input), stdin); if (input[0] == '*') break; printf("%d\n", calc(root)); } printf("\n"); }
return 0; }
|