【codevs】2292图灵机游戏

题 

Shadow最近知道了图灵机是什么(Shadow:就是一行格子和一个机器头移来移去的呗!),于是他突发奇想,创造了一个新游戏——“图灵机游戏”(Shadow:好听吧?)。

游戏规则如下:

在一条长长的纸上有N个格子,每个格子上都有一个数,第i格的数记为Ai,机器头刚开始在第1格。这个游戏有两个操作:

1.如果现在在第i格,则可以移动机器头到第Ai格;

2.把某个Ai减少或增加1。

然而,fotile96看了之后却不以为然。“嗯,你挑战一下用最少次数使机器头到达第N格吧,这样好玩些……”

现在,Shadow已经快Crazy了。于是,Shadow把脸转向了你……

 

之前写了一个bfs分三种情况讨论然而只能得一半的分(○` 3′○)

后来师兄解释了一遍才知道其实只有一种情况,就是最简单的bfs就可以辣(o゜▽゜)o☆

好像也有写spfa的(大雾)

 

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;

int n;

int a[100001];

int queue[100001];

int head=1;

int tail=1;

int ans[100001];

bool f[100001];

void bfs()

{

queue[1]=a[1];//入队第一个点

f[a[1]]=true;//标记

ans[a[1]]=1;//记录步数

while(head<=tail)//当队列不为空

{

int u=queue[head];//!!注:这里不要再把出队的元素标记为false了,你不会再访问一个已访问了的点,标记false的话可能会跳不出循环最终RE

if(u==n)  return;

        if (!f[a[u]])

        {

            queue[++tail]=a[u];

            ans[a[u]]=ans[u]+1;

            f[a[u]]=true;

        }

        if (u<n&&!f[u+1])//边界

        {

            queue[++tail]=u+1;

            ans[u+1]=ans[u]+1;

            f[u+1]=true;

        }

        if (u>1&&!f[u-1])

        {

            queue[++tail]=u-1;

           ans[u-1]=ans[u]+1;

            f[u-1]=true;

        }

        ++head;

    }

}

int main()

{

scanf("%d",&n);

memset(f,0,sizeof(f));

for(int i=1;i<=n;i++)

{

scanf("%d",&a[i]);

}

if(n==1) 

{

printf("%d",0);//***!如果只有一个格子就不用跳了=v=

return 0;

}

bfs();

printf("%d",ans[n]);

return 0;

}

 

 

蒟蒻= =,请多指教

posted @ 2015-10-16 08:30  Oranges  阅读(329)  评论(0编辑  收藏  举报