poj3278_bfs

题意:X坐标轴上有A,B两点,两点的坐标都介于0与100000之间(包括),A点可以有两种方式走动:1.从A走到A-1或者A+1,用时1分钟。2.从A到2*A,用时1分钟,求从A到B最短的时间。

分析:这个题用BFS,数组应该开多大呢?有的点乘以2后会比100000大。其实开100001就可以了。如果存在一个路径中有比100000还大的点,那一定存在一条所用时间还要小的所有的点都在100000一下的路径。

代码很简单:

View Code
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <queue>
 4 #include <memory.h>
 5 using namespace std;
 6 const int maxnum=100001;
 7 const int maxx=200000;  //这里出问题了。。。。
 8 int d[maxnum];
 9 int main()
10 {
11     int n,k,t,i;
12     queue<int> q;
13     scanf("%d%d",&n,&k);
14     for(i=0;i<maxnum;i++)
15         d[i]=maxx;
16     d[n]=0;
17     q.push(n);
18     while(!q.empty())
19     {
20         t=q.front();
21         q.pop();
22         if(t==k)
23             break;
24         if(t*2>=0 && t*2<maxnum && d[t*2]==maxx)
25         {
26             d[t*2]=d[t]+1;
27             q.push(t*2);
28         }
29         if(t-1>=0 && t-1<maxnum && d[t-1]==maxx)
30         {
31             d[t-1]=d[t]+1;
32             q.push(t-1);
33         }
34         if(t+1>=0 && t+1<maxnum && d[t+1]==maxx)
35         {
36             d[t+1]=d[t]+1;
37             q.push(t+1);
38         }
39     }
40     printf("%d\n",d[t]);
41     return 0;
42 }

 

posted @ 2012-07-30 08:29  pushing my way  阅读(205)  评论(0编辑  收藏  举报