大神用位运算实现的更简短:
http://blog.csdn.net/mobius_strip/article/details/51123015
#include<stdio.h>
#include<string.h>
int l[8] ={0,0,0,0,1,1,1,1};
int c[8] ={0,0,1,1,0,0,1,1};
int r[8] ={0,1,0,1,0,1,0,1};
int a[8];
int res[35];
int len;
bool ok;
void org(int cur,int* ans)
{
if(cur==len-1)
{
for(int i =0; i < 8;i++)
{
if(ans[cur-1]==l[i] && ans[cur]==c[i]&& ans[0]==r[i] && res[cur]==a[i])
{
ok = true;
break;
}
}
return;
}
if(cur==len-2)
{
for(int i =0; i < 8;i++)
{
if(ans[cur-1]==l[i] && ans[cur]==c[i]&& ans[cur+1]==r[i] && res[cur]==a[i])
{
org(cur+1,ans);
}
}
return;
}
if(cur==0)
{
for(int i =0; i < 8;i++)
{
if(res[0] == a[i])
{
ans[0]=c[i];
ans[1]=r[i];
ans[len-1]=l[i];
org(cur+1,ans);
}
}
return;
}
for(int i = 0;i < 8;i++)
{
if(ans[cur-1]==l[i] && ans[cur]==c[i]&& res[cur]==a[i])
{
ans[cur+1] = r[i];
org(cur+1,ans);
}
}
}
int main()
{
//
freopen("input.txt","r",stdin);
int isa;
while(scanf("%d",&isa)==1)
{
scanf("%d",&len);
memset(a,0,sizeof(a));
memset(res,0,sizeof(res));
getchar();
for(int i =0; i < len;i++)
{
res[i]=getchar()-'0';
}
int i = 0;
while(isa)
{
if(isa&1)
a[i] = 1;
i++;
isa = isa>>1;
}
ok = false;
int ans[35];
memset(ans,0,sizeof(ans));
org(0,ans);
if(ok)
puts("REACHABLE");
else
puts("GARDEN OF EDEN");
}
}