啊哈算法-bfs-解救小哈

//第一篇博客,基于自己的理解,对解救小哈的详细解读。//

#include<stdio.h>
struct note//定义一个结构体队列 
{
 int x;//横坐标 
 int y;//纵坐标 
 int s;//步数 
}; 
int main()
{
 struct note que[2501];//地图大小不超过50*50
 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,endx,endy,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,&endx,&endy);//输入起点坐标,终点坐标; 
 head=1;
 tail=1; 
 que[head].x=stratx;
 que[head].y=straty;
 que[head].s=0;
 //起点x坐标,起点y坐标,步数,存入队列 
 tail++;//尾巴往后指一位 
 book[startx][starty]=1;//起点坐标标记走过 
 flag=0;
 while(head<tail)//头尾不相等循环 
 {
  for(k=0;k<=3;k++)//四个方向走 
  {
   tx=que[head].x+next[k][0];//走后x的坐标 
   ty=que[head].y+next[k][1];//走后y的坐标 
   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;//走完x坐标存入对列 
    que[tail].y=ty;//走完y坐标存入对列 
    que[tail].s=que[head].s+1;//步数加一 
    tail++; //尾巴往后移 
   }
   if(tx==endx&&ty==endy)//如果走到终点结束 
   {
    flag=1;
    break;
   }
  }
  if(flag==1)
   break;
  head++;//头往后移,也就是下一个位置的坐标继续走 
  } 
  printf("%d",que[tail-1].s);//tail-1是因为tail永远是在最后一位的后一位,所以输出的时候要tail-1,才是答案 
  return 0;
} 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值