题意:这题实在太难懂了。。先给出了一个数字aut,他的二进制可以放到表格中new中,例子中的就是90的二进制就是new里从上到下表示的,在将数字放进去后,这就形成了一个转化规则,然后再输入n和1个长度为n由01组成数字,判断根据这个序列和转化规则这个转化能否形成一个新的序列是一个环。
题解:用一个now[N]数组存储新序列,注意由输入得到的tar[N]序列的tar[0]去比对new即给出的aut 的二进制可以取出对应的转化之前的三个数字,放到now[0],now[1],now[2]中,然后如果tar[1]也比对aut的二进制又找到三个数字,如果这三个数字的前两个和now[1],now[2]对应相等,可以确定now[3],之后以此类推,如果一直能推到最后一个tar[n - 1],并且新序列的最后两个数和开头两个数相等说明有环,输出R...E 否则继续递归寻找直至结束都没有就是GARDEN...
#include <stdio.h>
const int N = 35;
int aut, n, flag, now[N], tar[N], aft[N];
int rule[8][3] = {{0, 0, 0}, {0, 0, 1}, {0, 1, 0}, {0, 1, 1}, {1, 0, 0}, {1, 0, 1}, {1, 1, 0}, {1, 1, 1}};
void dfs(int cur) {
if (cur == n) {
if (now[0] == now[n] && now[1] == now[n + 1])
flag = 1;
return;
}
for (int i = 0; i < 8; i++) {
if (aft[i] == tar[cur] && rule[i][0] == now[cur] && rule[i][1] == now[cur + 1] ) {
now[cur + 2] = rule[i][2];
dfs(cur + 1);
}
}
}
int main() {
char c;
while (scanf("%d%d", &aut, &n) != EOF) {
flag = 0;
for (int i = 0; i < 8; i++) {
if (aut & (1 << i))
aft[i] = 1;
else
aft[i] = 0;
}
getchar();
for (int i = 0; i < n; i++) {
scanf("%c", &c);
tar[i] = c - '0';
}
for (int i = 0; i < 8; i++)
if (aft[i] == tar[0]) {
now[0] = rule[i][0];
now[1] = rule[i][1];
now[2] = rule[i][2];
dfs(1);
if (flag)
break;
}
if (flag)
printf("REACHABLE\n");
else
printf("GARDEN OF EDEN\n");
}
return 0;
}