2292 圖靈機遊戲

自為風月馬前卒發表於2017-04-21

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格,結束遊戲
 
 
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #include<cstdlib>
 6 using namespace std;
 7 const int MAXN=10000001;
 8 int n;
 9 int a[MAXN];
10 int vis[MAXN];
11 int dis[MAXN];
12 void bfs()
13 {
14     int step=0;
15     queue<int>q;
16     q.push(a[1]);
17     vis[a[1]]=1;
18     dis[a[1]]=1;
19     while(q.size()!=0)
20     {
21         int p=q.front();
22         if(p==n)return ;
23         q.pop();
24                 if(vis[a[p]]==0)
25                 {
26                     q.push(a[p]);
27                     dis[a[p]]=dis[p]+1;
28                     vis[a[p]]=1;
29                 }
30                 if(vis[p+1]==0&&p<n)
31                 {
32                     q.push(p+1);
33                     dis[p+1]=dis[p]+1;
34                     vis[p+1]=1;
35                     //a[p]++;
36                 }
37                 if(vis[p-1]==0&&p>0)
38                 {
39                     q.push(p-1);
40                     dis[p-1]=dis[p]+1;
41                     vis[p-1]=1;    
42                 }    
43     }
44     
45 }
46 int main()
47 {
48     scanf("%d",&n);
49     for(int i=1;i<=n;i++)
50     {
51         scanf("%d",&a[i]);
52     }
53     bfs();
54     printf("%d",dis[n]);
55     return 0;
56 }

 

相關文章