zoukankan      html  css  js  c++  java
  • 解救小哈——bfs广搜

    • 问题描述:

    小哈去玩迷宫,结果迷路了,小哼去救小哈。迷宫由n行m列的单元格组成(n和m都小于等于50),每个单元格要么是空地,要么是障碍物。

    问题:帮小哼找到一条从迷宫的起点通往小哈所在位置的最短路径。(注意:障碍物不能走,小哼也不能走出迷宫外,0表示空地,1表示障碍物)

    输入:

    5 4

    0 0 1 0
    0 0 0 0
    0 0 1 0
    0 1 0 0
    0 0 0 1
    1 1 4 3

    输出:

    7

    • 代码:

    #include<cstdio>
    #include<iostream>
    #define INF 10000000
    using namespace std;
    int a[50][50],b[50][50];
    int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//四个方向
    
    struct node//用结构体模拟队列
    {
        int x;
        int y;
        int s;//记录步数
    
    }que[2505];
    
    int main()
    {
        int n,m,sx,sy,ex,ey,tx,ty;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&a[i][j]);
        scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
        //初始化队列
        int head=1;
        int tail=1;
        //将起点入队
        que[tail].x=sx;
        que[tail].y=sy;
        que[tail].s=0;
        tail++;//队尾指针++,队尾指针要指向空队列
        b[sx][sy]=1;//标记起点
        int flag=0;
        //开始广搜
        while(head<tail)//队列不为空
        {
            for(int i=0;i<4;i++)//四个方向搜索
            {
                //计算从父亲(head)点到下一个点
                tx=que[head].x+next[i][0];
                ty=que[head].y+next[i][1];
                if(tx<1||ty<1||tx>n||ty>m)//是否越界
                {
                    continue;
                }
                if(b[tx][ty]==0&&a[tx][ty]==0)//这个点没有走过并且是空地
                {
                    b[tx][ty]=1;//标记走过,此处与深搜不同,不能还原标记
                    //将此点入队
                    que[tail].x=tx;
                    que[tail].y=ty;
                    que[tail].s=que[head].s+1;//父亲(head)的步数加1
                    tail++;//队尾指针++
                }
                if(tx==ex&&ty==ey)
                {
                    flag=1;
                    break;//走到终点
                }
            }
            if(flag==1)
                break;
            head++;//四个方向可以进入路径的都以入队,将head出队
        }
        printf("%d
    ",que[tail-1].s);//输出最后一个队列元素的步数,tail指向最后一个元素的下一个位置,所以-1
        return 0;
    }
  • 相关阅读:
    远程服务器同步配置
    什么是微服务架构,.netCore微服务选型
    Servlet与JSP版本历史以及Tomcat支持的版本
    JDK里面的JRE是什么
    JDK与Java SE/EE/ME的区别
    javaBean和Servlet有什么区别
    JSP的JSTL标签使用
    Java语法教程
    eclipse使用教程
    JSP生命周期
  • 原文地址:https://www.cnblogs.com/boboyuzz/p/10417728.html
Copyright © 2011-2022 走看看