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 #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 }