您的位置:首页 > 其它

【codevs 2292】图灵机游戏

2016-09-29 08:52 239 查看
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。

样例解释

1.先将第1格的值加1

2.跳到第4格

3.跳到第5格,结束游戏

边权是1 那么bfs就可以解决

每次+1或者-1可以看成 加边

建图最短路也可以

要注意的就是只有1个点的情况

从本身到本身 是不需要操作的

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int MAXN = 500000 + 5;
int to[MAXN];
int deep[MAXN];
bool use[MAXN];
queue<int>q;
int n;
void spfa(int s)
{
deep[s] = 1;
use[s] = true;
while(!q.empty())
q.pop();
q.push(s);
while(!q.empty())
{
int u = q.front();
q.pop();
if(!use[to[u]])
{
q.push(to[u]);
use[to[u]] = true;
deep[to[u]] = deep[u] + 1;
}
if(!use[u + 1] && u + 1 <= n)
{
q.push(u + 1);
use[u + 1] = true;
deep[u + 1] = deep[u] + 1;
}
if(!use[u - 1] && u - 1 >= 1)
{
q.push(u - 1);
use[u - 1] = true;
deep[u - 1] = deep[u] + 1;
}
}
return;
}
int tmp;
int main()
{
scanf("%d",&n);
if(n == 1)
{
puts("0");
return 0;
}
for(int i = 1; i <= n; i ++)
scanf("%d",&to[i]);
spfa(to[1]);
printf("%d\n",deep
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: