就是题目特别难懂
#include<stdio.h>
#include<string.h>
int left[8] = {0,0,0,0,1,1,1,1};
int cell[8] = {0,0,1,1,0,0,1,1};
int right[8] = {0,1,0,1,0,1,0,1};
int newc[8];
int autom;
int len;
char cnum[50];
int target[50];
int ans[50];
bool dfs(int cur)
{
if(cur == len-2)
{
bool a = false,b = false;
for(int i=0; i < 8; ++i)
{
if(!a)
{
a = left[i] == ans[cur-1] &&\
cell[i] == ans[cur] &&\
right[i] == ans[cur+1] &&\
newc[i] == target[cur];
}
if(!b)
{
b = left[i] == ans[cur] &&\
cell[i] == ans[cur+1] &&\
right[i] == ans[0] &&\
newc[i] == target[cur+1];
}
}
return a&&b;
}
for(int i=0; i < 8; ++i)
{
if(left[i] == ans[cur-1] &&\
cell[i] == ans[cur] &&\
newc[i] == target[cur])
{
ans[cur+1] = right[i];
if(dfs(cur+1))
return true;
}
}
return false;
}
int main()
{
//
freopen("input.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d %d %s", &autom, &len, cnum) == 3)
{
for(int i=0; i < len; ++i)
{
target[i] = cnum[i]-'0';
}
memset(newc, 0, sizeof(newc));
int w=0;
while(autom)
{
newc[w++] = autom%2;
autom /= 2;
}
bool ok = false;
for(int i=0; i < 8; ++i)
{
if(target[0] == newc[i])
{
memset(ans, 0, sizeof(ans));
ans[len-1] = left[i];
ans[0] = cell[i];
ans[1] = right[i];
ok = dfs(1);
if(ok)
break;
}
}
if(ok)
printf("REACHABLE\n");
else
printf("GARDEN OF EDEN\n");
}
}