1 /* 2 BFS(广度优先搜索) 3 在本道题中用来寻找最短路径 4 5 在这里采用模板 6 7 */ 8 #include<cstdio> 9 #include<cstring> 10 #include<queue> 11 12 #define maxn 202 13 14 using namespace std; 15 16 int N,k[maxn]; 17 18 int BFS(int s,int v)//s起点 v终点 19 { 20 if(s==v) return 0; 21 22 bool jud[maxn];//判断是否遍历过 23 memset(jud,false,sizeof(jud)); 24 int dis[maxn];//记录路径 25 memset(dis,0,sizeof(dis)); 26 queue<int> Q; 27 28 Q.push(s); 29 jud[s]=true; 30 while(!Q.empty()) 31 { 32 int th=Q.front(); 33 Q.pop(); 34 if(th==v) break;//起点终点重合时,退出循环 35 36 int next; 37 for(int i=-1;i==-1||i==1;i+=2)//重点就在于这里的路径怎么写,本题是加减楼层 38 { 39 next=th+k[th]*i;//拓展节点 40 if(next<=0||next>N) continue;//是否超出范围 41 42 if(!jud[next]) 43 { 44 Q.push(next); 45 jud[next]=true; 46 dis[next]=dis[th]+1; 47 } 48 } 49 50 } 51 if(dis[v]==0) return -1; 52 else return dis[v]; 53 } 54 55 bool Do() 56 { 57 int A,B; 58 if(scanf("%d%d%d",&N,&A,&B),N==0) return false; 59 for(int i=0;i<N;i++) 60 { 61 scanf("%d",&k[i+1]); 62 } 63 printf("%d\n",BFS(A,B)); 64 return true; 65 } 66 67 int main() 68 { 69 while(Do()); 70 return 0; 71 }
时间: 2024-10-18 06:09:38