广搜

#include
struct node
{
  int x;//横坐标 
  int y;//纵坐标 
  int f;//父节点在队列中的编号,用于输出路径 
  int s;//步数 
};
int main()
{
  struct node que[2501];//创建队列记录坐标步数 
  int a[51][51]={0},book[51][51]={0};//a数组用于储存地图book数组用于记录是否走过 
  int next[4][2]={{0,1},//表示走的四个方向 
                  {1,0},
                  {0,-1},
                  {-1,0}};
  int head,tail;
  int i,j,k,n,m,startx,starty,p,q,tx,ty,flag;
  scanf("%d%d",&n,&m);
  for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
      scanf("%d",&a[i][j]);//输入地图 
  scanf("%d%d%d%d",&startx,&starty,&p,&q);//入口和出口 
  //队列初始化
  head=1;
  tail=1;
  que[tail].x=startx;
  que[tail].y=starty;
  que[tail].f=0;
  que[tail].s=0;
  tail++;//开始广搜 
  book[startx][starty]=1;
  flag=0;//标记还未到达出口 
  while(headn || ty<1 || ty>m)
        continue;//若越界进入下一次循环 
      if(a[tx][ty]==0 && book[tx][ty]==0)//判断是否为障碍物或已经在路径中 
      {
        book[tx][ty]=1;//入队标记 
        que[tail].x=tx; 
        que[tail].y=ty;
        que[tail].f=head;
        que[tail].s=que[head].s+1;
        tail++;
      } 
      if(tx==p && ty==q)//判断是否到达出口 
      {
        flag=1;
        break;
      } 
    }
    if(flag==1)
      break;
    head++;//在完成4个方向的搜索后出队抛弃父节点 
  }
  printf("%d",que[tail-1].s);
  return 0;
  
} 

1,和深搜不同,广搜的每次搜索不需要到达最后一个节点,而是记录每一层的所以节点,然后向下一层搜索记录,因为广搜的方式类似于同步进行多条路线,所以最终输出的就是最早到达出口的最终节点,若要得到最长的路径可以去除flag这个标记值,这样最后输出的一定是最长的路径;
2,和深搜相比广搜没有涉及递归调用和标记节点的回收
3,广搜适用于求图的最短路径 深搜适用整个图的遍历,一般用于求多个解的情况;
4,广搜适合边权值相同的图
广搜_第1张图片
广搜_第2张图片
广搜_第3张图片

#include
int main()
{
  int i,j,n,m,a,b,cur,book[101]={0},e[101][101];
  int que[10001],head,tail;
  scanf("%d%d",&n,&m);
  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
      if(i==j)
        e[i][j]=0;
      else
        e[i][j]=999999999;
  for(i=1;i<=m;i++)
  {
    scanf("%d%d",&a,&b);
    e[a][b]=1;
    e[b][a]=1;
  }
  head=1;
  tail=1;
  que[tail]=1;
  tail++;
  book[1]=1;
  while(headn)
        break;
    }
    head++; 
  }
  for(i=1;i

你可能感兴趣的:(广搜)