Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2877833
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-04-11 22:14:40

广度优先遍历类似于树的按层次遍历。采用的搜索方法的特点是尽可能先对横向进行搜索,故称其为广度优先搜索(Breadth-FirstSearch)。相应的遍历也就自然地称为广度优先遍历。
注意:
1、在遍历过程中需要一个访问标志数组;
2、为了顺次访问路径长度为2、3、。。。的顶点,需附设队列以存储已经被访问的路径长度为1,2,3,...的顶点。

现在写一下关于我对队列的心得体会:


 

点击(此处)折叠或打开

  1. #include<queue>

  2. 1.queue<int> Q; //这个就是建立一个队列,名字叫Q,队列里的所有元素都是int整型;

  3. 2.Q.push(a); //这个就是将一个元素a,push进去排队;

  4. 3.b=Q.front(); //这个就是队列Q的排最前第一个的元素的值赋给b;

  5. 4.Q.pop(); //这个就是将排第一的元素移出队列,第二个的自然跟上;

  6. 5.Q.empty(); //这个就是判断队列Q是否为空,如果空就是1,不空就是0。

  7. memset(flag,0,sizeof(flag))//将数组置为0;


 

比如:

题目大意:FJ的牛跑了,FJ想在最短的时间内把他追回来。如果FJ在格子 i 则FJ可以在一分钟内移动到 i -1,i+1(跑步)和 i*2(乘飞机) 三个格子中的任意一个,每组数据给出

n FJ当前位置 
k cow所在位置(cow是不会跑的)

求FJ最少需要多少时间才能把逃跑了的cow追回来

按广度优先,为什么呢,因为我们从三个方向广度搜索的话,路径是不断增加,那么只要一搜到目标,就可以输出,因为无论从哪一个分支搜索到,它们都是在同一层,即为所求的最小步数;


点击(此处)折叠或打开

  1. #include<iostream>
  2. #include<queue>
  3. using namespace std;
  4. int line[100001];//可以作为标志,并且存储增量
  5. int n,k;

  6. void BFS()
  7. {
  8.     queue<int>q;//存储坐标
  9.     q.push(n);
  10.     line[n]=1;
  11.     while(!q.empty())
  12.     {
  13.         int t=q.front();
  14.         q.pop();
  15.         if(t==k)
  16.             break;
  17.         int next=t-1;//
  18.         if(next>=0 && !line[next])
  19.         {
  20.             q.push(next);
  21.             line[next]=line[t]+1;
  22.         }
  23.         
  24.         next=t+1;//
  25.         if(!line[next])
  26.         {
  27.             q.push(next);
  28.             line[next]=line[t]+1;
  29.         }

  30.         next=t*2;//向右飞跃
  31.         if(next<=100000 && !line[next]&& (next-k)<(k-t))// 两倍的距离要少于直接距离
  32.         {
  33.             q.push(next);
  34.             line[next]=line[t]+1;
  35.         }
  36.     }
  37. }
  38. int main()
  39. {
  40.     while(scanf("%d%d",&n,&k)!=EOF)
  41.     {
  42.         memset(line,0,sizeof(line));
  43.         if(n>=k)
  44.             printf("%d\n",n-k);
  45.         else
  46.         {
  47.             BFS();
  48.             printf("%d\n",line[k]-1);
  49.         }
  50.     }
  51.     return 0;
  52. }



阅读(749) | 评论(0) | 转发(0) |
0

上一篇:搜索的特点

下一篇:(转)常见的链表题目

给主人留下些什么吧!~~