10001 - Garden of Eden

描述:题目挺难理解的,通过编码规则,查看是否存在与长度为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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值