码迷,mamicode.com
首页 > 其他好文 > 详细

Busy Beavers(暴力模拟)

时间:2016-08-14 07:15:24      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

 由于排版问题,题目无法显示,可以到 http://7xjob4.com1.z0.glb.clouddn.com/e4872a15819b6bf9d1e5250bacc2a30b  查看

题目大意是有只海狸在一排无穷多的好树上,起始心情是A,问经过一系列操作后,能否心情好(心情变成H)。

给出十组数据分别代表,A心情时,对好树的操作,A心情时,对坏树的操作,B心情时,对好树的操作,B心情时,对坏树的操作。。。以此类推

具体的操作有三种,给出的三个字符分别代表三种操作。第一种1和0代表,把当前的树变成坏树(1)或者好树(0);第二种L和R代表往左移动(L)或者往右移动(R);第三种字符(A~E和H)代表经过这树后的心情会变成什么。

那么我们可以用一个数组M,记录当前心情和树的状态为某个值时对应的操作。比如M[0]代表A心情时对好树的操作,M[1]代表A心情时对坏树的操作,以此类推。。

我们再开一个2e的bool数组模拟树的状态,我们从下标为1e的点开始,起始状态为A心情,好树,那我们就对应选择M[0]操作,假设M[0]为1RB,那我们把这树的状态改为1(坏树),然后心情变为B,然后向右走,此时海狸心情为B,树为好树,那我们对应选择M[2]。。。然后模拟5000w次,如果找到H心情,则break。

#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=1e8;
bool tree[2*maxn];
struct node{
    bool ok;//代表要将树变成什么状态
    int step;//代表下一步动作
    int mood;//0,2,4,6,8,14分别代表心情A,B,C,D,E,H
}M[10];
char str[5];
int main()
{
    freopen("beavers.in","r",stdin);
    freopen("beavers.out","w",stdout);
    for (int i=0;i<10;i++)
    {
        scanf("%s",str);
        M[i].ok=str[0]-0;
        M[i].step=(str[1]==L)?-1:1;
        M[i].mood=2*(str[2]-A);
    }
    int pos=maxn,Mood=0,ok=0;//下标从1e开始,起始心情为0
    int all=50000000;//一共模拟5000w次
    while (all--)
    {
        bool cur=tree[pos];
        tree[pos]=M[Mood+cur].ok;//改变树的状态
        pos+=M[Mood+cur].step;//移动
        Mood=M[Mood+cur].mood;//改变心情
        if (Mood==14)//14代表H,如果遇到H,break
        {
            ok=1;
            break;
        }
    }
    if (ok) puts("happy beaver");
    else puts("unhappy beaver");
    return 0;
}

 

Busy Beavers(暴力模拟)

标签:

原文地址:http://www.cnblogs.com/scaugsh/p/5769237.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!