对BFS的感受

原创 2012年03月25日 22:10:46

BFS的感受

  我们在培训基地接触到的第一个名词是DFS,第二个是BFS。后来感触最深的是BFS

基地培训给一道这样的题:(插图)

看到这一道题时,我就想对于每个房间,我们都需要用相同的方法进行检测,所以用递归去解决或许比较方便。对于那个三维数组的建立,因为要在子函数中操作,我就把它设成静态的数组。刚开始我不知道为什么有的测试用例会通过,后来一想,原来是第一次递归调用时就找到了最短的路径。但由于前面的递归调用影响了数组的数值,后面所操作的数组不再是原来的数组了,也就是说,静态的数组不能进行这样的递归调用。后来也进行过几次修改,但是越改毛病越多。(程序1

#include<stdio.h>

static int N1,N2,N3,M;

int panduan(int map[100][100][100],int a2,int a3,int a4,int bushu)

{

     if(a2==N1-1&&a3==N2-1&&a4==N3-1)

     {

        if(bushu>M)

                       bushu=-1;

              printf("%d\n",bushu);

              return 0;

     }

     else if(bushu>N1*N2*N3)

     {

              printf("-1\n");

              return 0;

     }

     else{

             if(map[a2][a3][a4]==1)

                   return 0;

             else

                       {

                           bushu++;                                                  //步数加一

                           map[a2][a3][a4]=1;

                      if(a2-1>=0) panduan( map,a2-1,a3,a4,bushu);                  //向外延伸

                           if(a2+1<=N1) panduan(map,a2+1,a3,a4,bushu);

                           if(a3-1>=0) panduan(map,a2,a3-1,a4,bushu);

                           if(a3+1<=N2-1) panduan(map,a2,a3+1,a4,bushu);

                           if(a4-1>=0) panduan(map,a2,a3,a4-1,bushu);

                            if(a4+1<=N3-1) panduan(map,a2,a3,a4+1,bushu);

                       }

     }

}

void main()

{

     int i1,map[100][100][100],i,j,k,N;

     scanf("%d",&N);

     for(i1=0;i1<N;i1++)

     {

              scanf("%d %d %d %d",&N1,&N2,&N3,&M);               //输入地图的大小

              for(i=0;i<N1;i++)

              {

                       for(j=0;j<N2;j++)

                       {

                                 for(k=0;k<N3;k++)

                                          scanf("%d",&map[i][j][k]);

                       }

              }

              panduan(map,0,0,0,0);

      }

}

 

周四的时候我看了一川借的一本关于c语言的书,里面讲的有BFS,其中给了一个类似的程序,是一个二维的迷宫问题,我认真地看了一遍,觉得没有必要用递归去解决,普通的循环就能解决。(程序2

#include<stdio.h>
struct point
{int a1,a2,a3,count;
}queue[100000];
int head=0,tail=0;
static map[100][100][100];
void enqueue(struct point p)                                             //插入队列
{
 p.count++;
 queue[tail++]=p;
}
struct point dequeue()                                                   //从队列取出
{
 return queue[head++];
}
void visit(int a1,int a2,int a3,int count)                                         //对该点操作
{
 struct point visit_point={a1,a2,a3,count};
 map[a1][a2][a3]=1;
 enqueue(visit_point);
}
void main()
{
 int N,n,i,j,k,X,Y,Z,W;
    struct point p;
 scanf("%d",&N);
 for(n=0;n<N;n++)
 {
  scanf("%d %d %d %d",&X,&Y,&Z,&W);
  for(i=0;i<X;i++)
  {
   for(j=0;j<Y;j++)
   {
    for(k=0;k<Z;k++)
    {
     scanf("%d",&map[i][j][k]);
    }
   }
  }
     p.a1=0;p.a2=0;p.a3=0,p.count=0;
  map[p.a1][p.a2][p.a3]=1;
  enqueue(p);
  while(head!=tail)
  {
   p=dequeue();
   if(p.a1==X-1&&p.a2==Y-1&&p.a3==Z-1)
    break;
   if(p.a1-1>=0&&map[p.a1-1][p.a2][p.a3]==0)
    visit(p.a1-1,p.a2,p.a3,p.count);
   if(p.a1+1<X&&map[p.a1+1][p.a2][p.a3]==0)
    visit(p.a1+1,p.a2,p.a3,p.count);
   if(p.a2-1>=0&&map[p.a1][p.a2-1][p.a3]==0)
    visit(p.a1,p.a2-1,p.a3,p.count);
   if(p.a2+1<Y&&map[p.a1][p.a2+1][p.a3]==0)
    visit(p.a1,p.a2+1,p.a3,p.count);
   if(p.a3-1>=0&&map[p.a1][p.a2][p.a3-1]==0)
    visit(p.a1,p.a2,p.a3-1,p.count);
   if(p.a3+1<Z&&map[p.a1][p.a2][p.a3+1]==0)
    visit(p.a1,p.a2,p.a3+1,p.count);
  }
  p.count--;
  if(p.a1==X-1&&p.a2==Y-1&&p.a3==Z-1)
  {
   if(p.count>W)
    printf("-1\n");
   else
    printf("%d\n",p.count);
  }
  else
   printf("-1\n");
 }
}
(昨天上传错了,那个程序是我参考的刘敏的,这个才是我做的程序) 

后来一直纠结的是自己测试的时候都是通过的,然而每次提交都会有错误。所以我认为做编程时和同学的交流是很重要的,这样才能发现自己发现不了的问题。

这次的基地培训感觉收获很大,以后继续努力!

版权声明:本文为博主原创文章,未经博主允许不得转载。

图像处理感想

图像处理是个可爱的问题。        为什么呢?         因为说他简单他也简单,就是为了提取边缘形状的一些特征然后进行分类回归预测,分割识别,(模式识别其实也不简单)         ...
  • qq_20823641
  • qq_20823641
  • 2016年05月10日 11:29
  • 555

图的邻接表表示及其BFS遍历

图的邻接表表示及其BFS遍历有下面这张图: 假设该图为有向图,边的指向均为小序号指向大序号。那么对该图的BFS遍历如下(假设从序号0的节点开始遍历): 遍历结果应为:a b f c g i...
  • ww1473345713
  • ww1473345713
  • 2016年08月09日 14:11
  • 330

《旧中国的黑社会》读后感

《旧中国的黑社会》读后感 http://book.kongfz.com/19900/725805177/ https://book.douban.com/subject/1429154/ ...
  • hello3389
  • hello3389
  • 2017年09月03日 16:03
  • 122

原子弹计划之感受

前言 最近这些天看了看大家分享的视频,有很多需要学习的地方,所以在这里写下我看视频的感受。   正题 一、规范     不同的公司有不同的规范,有些公司对于规范要求很严,而有些公司就没有规范...
  • zhaodandan19910306
  • zhaodandan19910306
  • 2013年02月06日 14:51
  • 1020

对于团队的一些感悟感想

对于团队的有些感悟 什么是团队,团队的作用是什么,有什么优势。 我认为可以先从做一件事情说起。 人做一件事情,要具备几个因素,一个是知识,就是做成这件事所具备的知识,而是资源,就是完成这件事情所...
  • zamzll
  • zamzll
  • 2015年06月09日 21:16
  • 1526

对C#的一点感想

        大学时学过JAVA 方面的基本知识,可能由于JBuilder运行速度的原因,对JAVA有些害怕,偶然的接触C#发现这个东西比较新,和JAVA有些相似,网络应用上也不错,出于“喜新厌旧”...
  • yuhq
  • yuhq
  • 2005年01月09日 23:49
  • 979

读《一个真实的林徽因》有感

读过《一个真实的林徽因》后,小有体会,记下来算是自己的读书心得吧。书上这样写林徽因:     她有说不尽的美丽——     林徽因的美丽,在她的外貌。两条小辫,颇具神采的清亮的双眸,有雕琢之美的精...
  • u012369559
  • u012369559
  • 2014年09月29日 13:24
  • 909

二叉树 深度优先搜索(DFS)、广度优先搜索(BFS)

深度优先搜索算法(Depth First Search),是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。 当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起...
  • chlele0105
  • chlele0105
  • 2014年08月22日 17:21
  • 8047

图的广度遍历(BFS)与深度遍历(DFS)

图的广度遍历(BFS)与深度遍历(DFS) 思路: 读取用户输入的结点个数、边的两端顶点,用一个邻接矩阵来代表图内的连通情况。然后取第一个结点放入双端队列中进行BFS /* BFS */ ...
  • powerwoo25
  • powerwoo25
  • 2015年08月23日 00:46
  • 1005

CNN基本问题

基本理解CNN降低训练参数的2大法宝局部感受野、权值共享 局部感受野:就是输出图像某个节点(像素点)的响应所对应的最初的输入图像的区域就是感受野。 权值共享:比如步长为1,如果每移动一个像素就有一...
  • Hungryof
  • Hungryof
  • 2016年01月11日 22:02
  • 3967
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对BFS的感受
举报原因:
原因补充:

(最多只允许输入30个字)