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

专题一 简单搜索 Problem C

时间:2015-07-13 13:53:29      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:http://poj.org/problem?id=3278

题目大意:一条线上,给定起点和终点,求最短路径。

     从当前点有三种选择,向左走一步,向右走一步,横坐标变为2倍。

解题思路:bfs搜索

     将起点放在队首。每次从起点拿出一点,然后向三个方向扩展。如果满足条件,放入队尾。

     如果该点满足,则返回总的步数。

代码如下:

技术分享
 1 #include<cstdio>
 2 #include<cstring>
 3 #define MAXN 200020
 4 
 5 int n,k;
 6 struct Point
 7 {
 8     int x,cost;//描述一点,该点的坐标,走过该点一共花费的时间
 9 };
10 Point Queue[MAXN];//一维数组,模拟队列的实现过程
11 bool vis[MAXN];//一维数组,标记该点是否走过
12 
13 int bfs()
14 {
15     memset(vis,0,sizeof(vis));//初始化,所有点都没走过
16 
17     int head=0,tail=1;//队首,队尾
18 
19     //描述队首
20     Queue[0].x=n;
21     Queue[0].cost=0;
22 
23     while(head<tail)
24     {
25         Point p=Queue[head++];//从队首拿出一点,并抛弃
26 
27         if(p.x==k)
28         {
29             return p.cost;//如果该点是终点,则返回总的花销
30         }
31 
32         if(p.x-1>=0 && vis[p.x-1]==0)//向左走一步,把该点放入队尾
33         {
34             vis[p.x-1]=1;
35             Queue[tail].x=p.x-1;
36             Queue[tail++].cost=p.cost+1;
37         }
38         if(p.x+1<=k && vis[p.x+1]==0)//向右走一步,把该点放入队尾
39         {
40             vis[p.x+1]=1;
41             Queue[tail].x=p.x+1;
42             Queue[tail++].cost=p.cost+1;
43         }
44         if(p.x+1<=k && vis[p.x*2]==0)//从X传送到2*X,把该点放入队尾
45         {
46             vis[p.x*2]=1;
47             Queue[tail].x=p.x*2;
48             Queue[tail++].cost=p.cost+1;
49         }
50     }
51 
52 }
53 
54 int main()
55 {
56     while(scanf("%d %d",&n,&k)!=EOF)
57     {
58         int res=bfs();
59         printf("%d\n",res);
60     }
61     return 0;
62 }
View Code

 

专题一 简单搜索 Problem C

标签:

原文地址:http://www.cnblogs.com/Page3/p/4642547.html

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