广搜

#include<stdio.h>
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(head<tail){
    for(k=0;k<=3;k++)
    {
      tx=que[head].x+next[k][0];
      ty=que[head].y+next[k][1];
      if(tx<1 || tx>n || 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,广搜适合边权值相同的图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
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(head<tail){
    cur=que[head];
    for(i=1;i<=n;i++)
    {
      if(e[cur][i]==1 && book[i]==0)
      {
        que[tail]=i;
        tail++;
        book[i]=1;
      }
      if(tail>n)
        break;
    }
    head++; 
  }
  for(i=1;i<tail;i++)
    printf("%d ",que[i]);
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值