CODEVS2292(又是一道浪费时间的小题。。。)

题目描述  Description

【Shadow 1】第二题

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

游戏规则如下:

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

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

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

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

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

 

思路:进行广搜最短路,每次有三种状态:进行已知的位移,位置加一或减一。比较简单的广搜,但是一开始无奈的写错了程序,理解错了题意,1这个点第一次只能到a

[1]的位置,不能+1或-1,一开始就是因为没有理解好题,写出了tle一个点的东西。。。(可能是我的思路和实现的不一样。。。),然后就a了。。。

用一个数组标记这个点是否入队,只标记,不置反。这样能保证一个点的ans最优,同时避免了循环对列。

 

95分:

#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

int que[5000001][3]={0},a[100001]={0},n,ll,ci[100001]={0};

void bfs()

{

    int head,tail,tt,i;

    head=0;tail=1;

    que[1][0]=1;

    que[1][1]=a[1];

    que[1][2]=0;

    ci[1]=0;

    while (head!=tail)

    {

        head=head%ll+1;

        if (que[head][0]!=que[head][1])

        {

            tt=tail%ll+1;

            if (que[head][2]+1<ci[que[head][1]])

            {

              ci[que[head][1]]=que[head][2]+1;

              tail=tail%ll+1;

              que[tail][0]=que[head][1];

              que[tail][1]=a[que[tail][0]];

              que[tail][2]=que[head][2]+1;

            }

            if (que[tail][0]==n)

                break;

        }

        if (que[head][1]<n&&que[head][2]+2<ci[que[head][1]+1])

        {

            ci[que[head][1]]=que[head][2]+2;

            tail=tail%ll+1;

            que[tail][0]=que[head][0];

            que[tail][1]=que[head][1]+1;

            que[tail][2]=que[head][2]+1;

        }

        if (que[head][1]>1&&que[head][2]+2<ci[que[head][1]-1])

        {

            ci[que[head][1]]=que[head][2]+2;

            tail=tail%ll+1;

            que[tail][0]=que[head][0];

            que[tail][1]=que[head][1]-1;

            que[tail][2]=que[head][2]+1;

        }

    }

}

int main()

{

    int i,j;

    memset(ci,127,sizeof(ci));

    ll=5000000;

    scanf("%d",&n);

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

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

    bfs();

    printf("%d\n",ci[n]);

}
View Code

100分:

#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

int que[1000001]={0},a[100001]={0},n,ll,ci[100001]={0};

bool use[100001]={false};

void bfs()

{

    int head,tail,i;

    head=tail=1;

    que[1]=a[1];

    ci[a[1]]=1;

    use[a[1]]=true;

    while (head<=tail)

    {

        if (que[head]==n) break;

        if (!use[a[que[head]]])

        {

            tail=tail+1;

            que[tail]=a[que[head]];

            ci[que[tail]]=ci[que[head]]+1;

            use[que[tail]]=true;

        }

        if (que[head]<n&&!use[que[head]+1])

        {

            tail=tail+1;

            que[tail]=que[head]+1;

            ci[que[tail]]=ci[que[head]]+1;

            use[que[tail]]=true;

        }

        if (que[head]>1&&!use[que[head]-1])

        {

            tail=tail+1;

            que[tail]=que[head]-1;

            ci[que[tail]]=ci[que[head]]+1;

            use[que[tail]]=true;

        }

        ++head;

    }

}

int main()

{

    int i,j;

    scanf("%d",&n);

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

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

    bfs();

    if (n==1) printf("0\n");

    else

      printf("%d\n",ci[n]);

}
View Code

 

你可能感兴趣的:(code)