FZU2285 迷宫问题 BFS求最短路-板子题

news/2024/7/3 10:47:45

Problem Description
洪尼玛今天准备去寻宝,在一个n*n (n行, n列)的迷宫中,存在着一个入口、一些墙壁以及一个宝藏。由于迷宫是四连通的,即在迷宫中的一个位置,只能走到与它直接相邻的其他四个位置(上、下、左、右)。现洪尼玛在迷宫的入口处,问他最少需要走几步才能拿到宝藏?若永远无法拿到宝藏,则输出-1。

Input
多组测试数据。

每组数据输入第一行为正整数n,表示迷宫大小。

接下来n行,每行包括n个字符,其中字符’.‘表示该位置为空地,字符’#'表示该位置为墙壁,字符’S’表示该位置为入口,字符’E’表示该位置为宝藏,输入数据中只有这四种字符,并且’S’和’E’仅出现一次。

Output
输出拿到宝藏最少需要走的步数,若永远无法拿到宝藏,则输出-1。

Sample Input

5
S.#…
#.#.#
#.#.#
#…E
#…

    #include<iostream>
    #include<queue>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    
    const int MAX = 1000;
    char maza[MAX][MAX];//记录迷宫
    int step[MAX][MAX];//记录步数
    int sx,sy,ex,ey;//记录起点和终点
    
    struct Point
    {
        int x;
        int y;
    } point1,point2;//记录当前位置和下一位置
    
    int dir[4][2]= {{0,1},{0,-1},{-1,0},{1,0}};//上下左右四个方向
    
    queue<Point> Q;//队列
    
    int main()
    {
        int n,flag;
        while(cin>>n)
        {
            flag=0;
            while(!Q.empty())
                Q.pop();//清空队列
            memset(step,0,sizeof(step));//把记录步数的数组设为0
    
            for(int i=0;i<n;++i)
                scanf("%s",maza[i]);
    
            for(int i=0; i<n; ++i)
                for(int j=0; j<n; ++j)
                {
                    if(maza[i][j]=='S')
                        sx=i,sy=j;
                    if(maza[i][j]=='E')
                        ex=i,ey=j;//遍历图形找到起点和终点
                }
    
            step[sx][sy]=1;//设起点为1表示已经被访问过
            point1.x=sx;
            point1.y=sy;
            Q.push(point1);//把起点添加到队列
    
            while(!Q.empty())//当队列不为空时进行循环查找队列
            {
                point1=Q.front();//拿出队列首元素
                Q.pop();//拿出后移除首元素
                for(int i=0; i<4; ++i)
                {
                    point2.x=point1.x+dir[i][0];
                    point2.y=point1.y+dir[i][1];
                    if( point2.x >= 0 && point2.y >= 0 && point2.x < n && point2.y < n && !step[point2.x][point2.y] && maza[point2.x][point2.y] != '#' )
                    {
                        //如果下一个节点不出边界,没被访问过且不是墙,则步数+1
                        step[point2.x][point2.y]=step[point1.x][point1.y]+1;
                        Q.push(point2);
                    }
                }
                if(step[ex][ey]!=0)
                {//找到出口
                    flag=1;
                    break;
                }
            }
            if(flag)
                cout<<step[ex][ey]-1<<endl;//因为起点为1,故需减去1则为步数
            else
                cout<<-1<<endl;
        }
        return 0;
    }


http://www.niftyadmin.cn/n/1285073.html

相关文章

android中的强指针和弱指针

在Android的源代码中&#xff0c;经常会看到形如&#xff1a;sp<xxx>、wp<xxx>这样的类型定义&#xff0c;这其实是Android中的智能指针。智能指针是C中的一个概念&#xff0c;通过基于引用计数的方法&#xff0c;解决对象的自动释放的问题。在C编程中&#xff0c;…

经典面试题-使用Spring框架能带来哪些好处?

下面列举了一些使用Spring框架带来的主要好处&#xff1a; Dependency Injection(DI) 方法使得构造器和JavaBean properties文件中的依赖关系一目了然。与EJB容器相比较&#xff0c;IoC容器更加趋向于轻量级。这样一来IoC容器在有限的内存和CPU资源的情况下进行应用程序的开发…

AtCoder Beginner Contest 154

A.题意&#xff1a;看输入输出即可 red blue 3 4 red2 4思路&#xff1a;这个题不是很难&#xff0c;但是我一上去就想要用map,然后就很悲催&#xff0c;map里面人家按照键值给你排序&#xff0c;所以输出的时候会有错&#xff01; #include<bits/stdc.h> #define pair…

经典面试题-什么是控制反转(IOC)?什么是依赖注入(DI)?

控制反转(IOC) 控制反转是应用于软件工程领域中的&#xff0c;在运行时被装配器对象来绑定耦合对象的一种编程技巧&#xff0c;对象之间耦合关系在编译时通常是未知的。在传统的编程方式中&#xff0c;业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使…

利用反转函数确定回文串

题意&#xff1a;给出一个字符串&#xff0c;然后让你判断是否为回文串&#xff0c;是得话输出YES&#xff0c;否则输出NO 思路&#xff1a;我们可以直接利用string 跟 reverse&#xff08;&#xff09;函数解决这个问题 #include<bits/stdc.h>using namespace std;int…

android中的binder通信机制

Binder机制是android中实现的进程间通信的架构&#xff0c;它采用的是c/s架构&#xff0c;client通过代理完成对server的调用。ServiceManager既然这里提到了server&#xff0c;那么我们有必要先了解下在android中是怎么来管理server的。先来看一个重要的Native进 程&#xff1…

经典面试题-请解释下Spring框架中的IoC?

Spring中的 org.springframework.beans 包和 org.springframework.context包构成了Spring框架IoC容器的基础。BeanFactory 接口提供了一个先进的配置机制&#xff0c;使得任何类型的对象的配置成为可能。ApplicationContex接口对BeanFactory&#xff08;是一个子接口&#xff0…

mediarecorder中的方法以及工作流程的过程

嵌套、关联的类 class MediaRecorder.AudioEncoder 定义音频编码 class MediaRecorder.AudioSource 定义声音资源 interface MediaRecorder.OnErrorListener Interface definition for a callback to be invoked when an error occurs while recording. interface M…