描述:题目挺难理解的,通过编码规则,查看是否存在与长度为N的编码相同,如果相同就输出REACHABLE,否则就输出GARDEN OF EDEN,编码规则需要转化为二进制,并且对应二进制,每一位要么是0,要么是1,但是要注意一点,回溯时一定要从0枚举到8,就因为这我wa了好几次;可能编码规则很难理解,就是假如数字是204,转化为二进制是11001100,那么编码规则就是
Left Cell Right New
[i-1] [i] [i + 1] State
0 0 0 0 0 * 2^0
0 0 1 0 0 * 2^1
0 1 0 1 1 * 2^2
0 1 1 1 1 * 2^3
1 0 0 0 0 * 2^4
1 0 1 0 0 * 2^5
1 1 0 1 1 * 2^6
1 1 1 1 1 * 2^7
然后进行回溯就可以了
#include <cstdio>
#include <cstring>
int n,m,flag;
int rule[10],num[40],str[40];
int cell[9][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(flag) return;
if(cur>=m-1)
{
for(int i=0; i<8; i++)
if(rule[i]==num[cur]&&str[cur-1]==cell[i][0]&&str[cur]==cell[i][1]&&str[0]==cell[i][2]&&str[m]==str[cur])
{
flag=1;
break;
}
}
else for(int i=0; i<8; i++)
if(rule[i]==num[cur]&&cell[i][0]==str[cur-1]&&cell[i][1]==str[cur])
{
str[cur+1]=cell[i][2];
dfs(cur+1);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.txt","r",stdin);
#endif
char s[40];
while(scanf("%d%d%s",&n,&m,s)!=EOF)
{
memset(rule,0,sizeof(rule));
memset(num,0,sizeof(num));
memset(str,0,sizeof(str));
int c=n;
flag=0;
for(int i=0; i<8; i++)
{
rule[i]=c%2;
c=c/2;
}
for(int i=0; i<m; i++) num[i]=s[i]-'0';
for(int i=0; i<8; i++)
if(rule[i]==num[0])
{
str[0]=cell[i][1];
str[m]=str[m-1]=cell[i][0];
str[1]=cell[i][2];
dfs(1);
if(flag) break;
}
if(flag) printf("REACHABLE\n");
else printf("GARDEN OF EDEN\n");
}
return 0;
}
10001 - Garden of Eden
最新推荐文章于 2021-03-03 12:55:30 发布