题目链接: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 }
时间: 2024-11-05 22:41:20