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邻接点的邻接点开始入队列。
*/

 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 }
View Code

 

posted on 2013-08-12 10:25  随风浪子的博客  阅读(255)  评论(0编辑  收藏  举报

导航