POJ_3278_Catch That Cow(图的广度优先遍历)
http://poj.org/problem?id=3278
/*
图的广度优先搜索算法思想:
是以层为顺序进行搜索,类似于树的层次遍历。
1:顶点v入队列。
2:当队列非空是继续执行,否则算法结束。
3:顶点v出队列,访问v,并标记已被访问
4:查找v的第一个邻接点cool,若cool没被访问过,则cool
入队列,
5:继续查找v的下一个邻接点转步骤4;
6:当v的邻接点全部入队列之后,从v邻接点的邻接点开始入队列。
*/
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # include <stdio.h> 2 # include <string.h> 3 # define MAX 1000051//数组一定要开大, 4 //以后做题没事用大数组. 5 int step[2*MAX]; 6 int front[2*MAX]; 7 int judge(int i) 8 { 9 if(step[i] ||i<0 ||i>=2*MAX ) 10 return 0; 11 else 12 return 1; 13 } 14 int BFS(int n,int k) 15 { 16 int fron=0,rear=0; 17 int x; 18 if(n==k) 19 return 0; 20 front[fron++]=n; 21 while(rear<fron) 22 { 23 x=front[rear++]; 24 if(x-1==k || x+1==k || x*2==k) 25 return step[x]+1; 26 if(judge(x-1)) 27 { 28 step[x-1]=step[x]+1; 29 front[fron++]=x-1; 30 } 31 if(judge(x+1)) 32 { 33 step[x+1]=step[x]+1; 34 front[fron++]=x+1; 35 } 36 if(judge(2*x)) 37 { 38 step[x*2]=step[x]+1; 39 front[fron++]=2*x; 40 } 41 } 42 return -1; 43 } 44 int main() 45 { 46 int n,k; 47 while(scanf("%d%d",&n,&k) != EOF) 48 { 49 memset(step,0,sizeof(step)); 50 printf("%d\n",BFS(n,k)); 51 } 52 return 0; 53 }