UVa 10001 - Garden of Eden

36 篇文章 0 订阅

这个题难点在理解题意,读了n遍都没有读懂,最后看的结题报告上的解释才明白它的意思。

题意:一共有256种自动机的编译形式,给你其中一种,你可以相应转换为对应的二进制数字串(即为表格中的一个New State),再根据这个标准编译串(New state)将给出的串逆转换,如果能逆转换成一个符合要求的新串则说明存在串可以转换为给出的串,则输出“REACHABLE”,否则不存在,输出“GARDEN OF EDEN”。

做法:dfs+判断,依次枚举给定的串中的数字对应的转换之前的连续邻接的三个数字,最后判断是否符合要求即可。

代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
char str[35];
int a[35], code[10], c[35], n;
int save[10][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} };
int dfs(int cur)
{
    if (cur == n - 1 || cur == n)
    {
        for (int i = 0; i < 8; i++)
            if (code[i] == a[cur]        &&
                save[i][0] == c[cur - 1] &&
                save[i][1] == c[cur]     &&
                save[i][2] == c[cur + 1] )
             {
                if (cur == n - 1 && !dfs(cur + 1))
                    return 0;
                else
                    return 1;
             }
        return 0;
    }
    for (int i = 0; i < 8; i++)
    {
        if (a[cur] == code[i]        &&
            c[cur - 1] == save[i][0] &&
            c[cur] == save[i][1] )
        {
            c[cur + 1] = save[i][2];
            if (dfs(cur + 1))
                return 1;
        }
    }
    return 0;
}

int main()
{
#ifdef test
    freopen("sample.txt", "r", stdin);
#endif
    int k ,num, flag;
    while (scanf("%d%d%s", &num, &n, str) == 3)
    {
        for (int i = 0; i < n; i++)
            a[i + 1] = str[i] - '0';
        k = num;
        for (int i = 0; i < 8; i++) // 将对应数字转换为一种自动机(即一种New State)
        {
            code[i] = k % 2;
            k /= 2;
        }
        flag = 1;
        for (int i = 0; i < 8; i++)
            if (a[1] == code[i])
            {
                c[0] = save[i][0];
                c[1] = save[i][1];
                c[2] = save[i][2];
                c[n] = c[0];
                c[n + 1] = c[1];
                if (dfs(2))
                {
                    flag = 0;
                    break;
                }
            }
        if(flag)
            printf("GARDEN OF EDEN\n");
        else
            printf("REACHABLE\n");
    }
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值