码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1548

时间:2016-04-24 21:24:21      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

 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 }

 

HDU 1548

标签:

原文地址:http://www.cnblogs.com/RocSAMA/p/5428116.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!