【codevs 2292】图灵机游戏

来源:互联网 发布:windows 添加字体文件 编辑:程序博客网 时间:2024/06/07 18:36

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[n]);    return 0;}
0 0