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 }