您的位置:首页 > 其它

AC日记——图灵机游戏 codevs 2292

2017-03-20 20:59 190 查看

2292 图灵机游戏

时间限制: 1 s

空间限制: 64000 KB

题目等级 : 黄金 Gold

题解
查看运行结果

题目描述 Description

【Shadow 1】第二题

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

游戏规则如下:

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

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

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

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

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

输入描述 Input Description

第1行,1个整数N;
第2行,N个整数Ai。

输出描述 Output Description

1行,1个整数,为最少的操作次数。

样例输入 Sample Input

5
3 4 2 5 3

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

对于30%的数据,1≤N≤10;
对于60%的数据,1≤N≤1000;
对于100%的数据,1≤N≤100000,1≤Ai≤N。

<h4>样例解释</h4>
1.先将第1格的值加1
2.跳到第4格
3.跳到第5格,结束游戏

思路:
  bfs;

来,上代码:

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

#define maxn 100005

using namespace std;

int if_z,n,ai[maxn],dis[maxn];

char Cget;

bool if_[maxn];

inline void in(int &now)
{
now=0,if_z=1,Cget=getchar();
while(Cget>'9'||Cget<'0')
{
if(Cget=='-') if_z=-1;
Cget=getchar();
}
while(Cget>='0'&&Cget<='9')
{
now=now*10+Cget-'0';
Cget=getchar();
}
now*=if_z;
return ;
}

int main()
{
in(n);queue<int>que;
for(int i=1;i<=n;i++) in(ai[i]);
if_[ai[1]]=true,dis[ai[1]]=1;que.push(ai[1]);
while(!que.empty())
{
int now=que.front();
if(!if_[ai[now]])
{
que.push(ai[now]);
if_[ai[now]]=true;
dis[ai[now]]=dis[now]+1;
}
if(now+1<=n&&!if_[now+1])
{
que.push(now+1);
if_[now+1]=true;
dis[now+1]=dis[now]+1;
}
if(now-1>1&&!if_[now-1])
{
que.push(now-1);
if_[now-1]=true;
dis[now-1]=dis[now]+1;
}
que.pop();
}
cout<<dis
;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: