wyh的迷宫

news2024/11/15 7:55:25

涉及知识点:求迷宫能否到达终点的,而不是求路径数的,用bfs时可以不用重置状态数组(回溯)。

题目描述

给你一个n*m的迷宫,这个迷宫中有以下几个标识:

s代表起点

t代表终点

x代表障碍物

.代表空地

现在你们涵哥想知道能不能从起点走到终点不碰到障碍物(只能上下左右进行移动,并且不能移动到已经移动过的点)。

输入描述:

输入第一行一个整数T(1<=T<=10)
接下来有T组测试数据,对于每一组测试数据,第一行输入2个数n和m(1<=n,m<=500)
接下来n行,每行m个字符代表这个迷宫,每个字符都是上面4个中的一种
数据保证只有一个起点和一个终点

输出描述:

对于每一组测试数据,如果可以的话输出YES,不可以的话输出NO

示例1

输入

复制1 3 5 s...x x...x ...tx

1
3 5
s...x
x...x
...tx

输出

复制YES

YES

想法:

用dfs求,结果超时了。毕竟都500层了……

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int ans;
char mg[510][510];
int a,b;//终点
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int st[510][510];
void dfs(int x,int y){
    for(int i=0;i<4;i++){
        int xx=dx[i]+x;
        int yy=dy[i]+y;
        if(xx<1||yy<1||xx>n||yy>m) continue;
        if(mg[xx][yy]=='x') continue;
        if(st[xx][yy]) continue;
        if(xx==a&&yy==b) {ans++; return;}
        st[xx][yy]=1;
        dfs(xx,yy);
        st[xx][yy]=0;
    }
}
int main(){
    int t;
    cin>>t;
    while(t--){

        memset(st,0,sizeof(st));
        ans=0;
        cin>>n>>m;
        int x,y;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>mg[i][j];
                if(mg[i][j]=='s') { x=i,y=j;}
                if(mg[i][j]=='t') { a=i,b=j;}
            }
        }
        dfs(x,y);
        if(ans) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0 ;
}

想法:

今天看网课,讲到bfs的时间复杂度要比dfs小(其实是回溯了的dfs时间复杂度才比bfs大很多),所以就试试bfs的写法,过了。还学到了一个小技巧,队列中的坐标的存储可以不用数对pair,用一个数值表示。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int ans;
char mg[510][510];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int st[510][510];
queue <int> q;
void bfs(int x,int y){
    q.push(x*m+y);
    while(!q.empty()){
        int a=q.front()/m;
        int b=q.front()%m;
        q.pop();
        for(int i=0;i<4;i++){
            int xx=a+dx[i];
            int yy=b+dy[i];
            if(mg[xx][yy]=='x') continue;
            if(mg[xx][yy]=='t') { ans=1;break;}//到终点
            if(st[xx][yy]) continue;
            if(xx>=n||xx<0||yy<0||yy>=m) continue;
            st[xx][yy]=1;
            q.push(xx*m+yy);
        }
        if(ans==1) return ;
    }
}
int main(){
    int t;
    cin>>t;
    while(t--){
        memset(st,0,sizeof(st));
        ans=0;
        cin>>n>>m;
        int x,y;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                cin>>mg[i][j];
                if(mg[i][j]=='s') { x=i,y=j;}
            }
        }
        st[x][y]=1;
        bfs(x,y);
        if(ans) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0 ;
}

事情到这并没有结束,我写完就去翻了一下别人的题解,发现其实也可以用dfs写出来,我们不需要具体路径,只需要知道起点终点是否连通(我本来想用连通块写的,但感觉还是会超时,就否决了),因此,本题不用回溯也不可以回溯,回溯会超时。这么做时间复杂度和上一个bfs的时一样的,就是全部格子都搜了一遍,时间复杂度为O(n*m)。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int ans;
char mg[510][510];
int a,b;//终点
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int st[510][510];
void dfs(int x,int y){
    for(int i=0;i<4;i++){
        int xx=dx[i]+x;
        int yy=dy[i]+y;
        if(xx<1||yy<1||xx>n||yy>m) continue;
        if(mg[xx][yy]=='x') continue;
        if(st[xx][yy]) continue;
        if(xx==a&&yy==b) {ans++; return;}
        st[xx][yy]=1;
        dfs(xx,yy);
        //st[xx][yy]=0;
    }
}
int main(){
    int t;
    cin>>t;
    while(t--){

        memset(st,0,sizeof(st));
        ans=0;
        cin>>n>>m;
        int x,y;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>mg[i][j];
                if(mg[i][j]=='s') { x=i,y=j;}
                if(mg[i][j]=='t') { a=i,b=j;}
            }
        }
        dfs(x,y);
        if(ans) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0 ;
}

嗐,其实还是感觉怪怪的,再想想吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1440674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

山西电力市场日前价格预测【2024-02-08】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-08&#xff09;山西电力市场全天平均日前电价为200.58元/MWh。其中&#xff0c;最高日前电价为347.58元/MWh&#xff0c;预计出现在07:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

信息安全省赛杂项题解题思路

task1 直接查看文件属性即可得到 flag task2 载入 HxD 中&#xff0c;搜索 flag 即可得到 task3 也是同样的操作&#xff0c;载入 HxD 中搜索 flag task4 打开题目的压缩包发现被加密了&#xff0c;这个题目的标题提示的很明显&#xff0c;就是四位数加密 四位数加密的 zip…

爪哇部落算法组2024新生赛热身赛题解

第一题&#xff08;签到&#xff09;&#xff1a; 1、题意&#xff1a; 2、题解: 我们观察到happynewyear的长度是12个字符&#xff0c;我们直接从前往后遍历0到n - 12的位置&#xff08;这里索引从0开始&#xff09;&#xff0c;使用C的substr()函数找到以i开头的长度为12的字…

新增C++max函数的使用

在 C 中&#xff0c;max函数是标准库中的一个函数&#xff0c;用于返回两个或多个元素中的最大值。max函数的声明如下&#xff1a; cpp #include <algorithm>template<class T> const T& max(const T& a, const T& b);这个函数接受两个同类型的参数a…

Qt网络编程-写一个简单的网络调试助手

环境 Windows&#xff1a;Qt5.15.2&#xff08;VS2022&#xff09; Linux&#xff1a;Qt5.12.12&#xff08;gcc) 源代码 TCP服务器 头文件&#xff1a; #ifndef TCPSERVERWIDGET_H #define TCPSERVERWIDGET_H #include <QWidget> namespace Ui { class TCPServerW…

Java学习17-- super类

重点&#xff1a;super类 & 方法重写 super类 super指的是本级的上一级&#xff0c;即father class父类 很好理解&#xff0c;比如Person class>Student class 当前在Student class执行&#xff0c;那么就写this.xxx 需要在Student程序里面调用Person&#xff0c;那就…

L3HCTF 2024

Check in 输入一个1就获得flag

打印斐波那契数列

定义&#xff1a; 斐波那契数列是指这样一个数列&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#xff0c;89……这个数列从第3项开始 &#xff0c;每一项都等于前两项之和。 …

【复现】九思OA系统 SQL注入漏洞_43

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 九思软件自主研发的iThink协同OA办公自动化系统是面向中高端企业、政府机关和事业单位、等大型企业的协同办公软件&#xff0c;面…

QLabel重绘实现圆角矩形图片/文本和图片同时显示

QLabel一般用于显示一段文字&#xff0c;这段文字可以被鼠标选中/复制&#xff0c;也可是设置自动换行等&#xff0c;还可以用于显示图片。 但是使用QLabel显示图片时&#xff0c;qss样式设置的圆角radius属性是不生效的。 QLabel显示纯文本时&#xff0c;设置了背景颜色后&a…

Vue3.0(五):Vue-Router 4.x详解

Vue-Router详解 vue-router教程 认识前端路由 路由实际上是网络工程中的一个术语 在架构一个网络的时候&#xff0c;常用到两个很重要的设备—路由器和交换机路由器实际上就是分配ip地址&#xff0c;并且维护着ip地址与电脑mac地址的映射关系通过映射关系&#xff0c;路由器…

【Godot4.2】文件系统自定义控件 - GroupButtons

GroupButtons 概述 读者朋友们好&#xff0c;我是巽星石&#xff0c;这是我的Godot4.2文件系统自定义控件系列文章。 在很多程序或插件设计中&#xff0c;都会用到一堆按钮的形式&#xff0c;好处是比较直观&#xff0c;用啥点啥&#xff0c;本质上相当于一个简化的二级树形…

【Git版本控制 01】基本操作

目录 一、初始配置 二、添加文件 三、查看日志 四、修改文件 五、版本回退 六、撤销修改 七、删除文件 一、初始配置 Git版本控制器&#xff1a;记录每次的修改以及版本迭代的一个管理系统。 # 初始化本地仓库&#xff1a;git init(base) [rootlocalhost gitcode]# gi…

【通讯录案例-偏好设置 Objective-C语言】

一、刚才,我们plist存储,讲完了,这个plist,我直接,右键,打开 打开 不用xcode,我就用文本文档打开,打开方式:其他 选择:文本编辑 打开 好,这个里边儿啊,就是我们刚才存的一个Key:Value 它本质上,是一个xml 这是一种文件的格式, 等你们讲到网络的时候,实际上,…

Android 环境搭建

1、桥接工具安装 网站地址&#xff1a;AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 使用安装包&#xff1a; adb 查看当前链接成功的设备&#xff1a;adb devices 使用adb shell指令来进入到手机的后台&#xff1a;

Ondo宣布将其原生稳定币USDY带入Sui生态

重要提示&#xff1a;USDY是由短期美国国债支持的token化票据&#xff0c;持有者享受稳定币的实用性同时获得收益。USDY不得在美国或向美国人出售或以其他方式提供。USDY也未根据1933年美国证券法注册。 不到一年的时间&#xff0c;Sui已经成为全链TVL排名前十的区块链&#xf…

MySQL- 运维-分库分表-Mycat

一、Mycat概述 1、安装 2、概念介绍 二、Mycat入门 启动服务 三、Mycat配置 1、schema.xml 2、rule.xml 3、server.xml 四、Mycat分片 1、垂直分库 2、水平分表 五、Mycat管理及监控 1、Mycat原理 2、Mycat管理工具 &#xff08;1&#xff09;、命令行 &#xff08;2&#…

SpringBoot + Tess4J 实现本地与远程图片的文字识别

1 前言 1.1 概要 在本文中&#xff0c;我们将探讨如何在Spring Boot应用程序里集成Tess4J来实现OCR&#xff08;光学字符识别&#xff09;&#xff0c;以识别出本地和远程图片中的文字。 我们将从添加依赖说起&#xff0c;然后创建服务类以实现OCR&#xff0c;最后展示如何处…

基于微信小程序的新生报到系统的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

如何给闲置电脑安装黑群晖

准备 diskgenius &#xff0c;黑群晖引导文件&#xff08;有些需要扩展驱动包&#xff09;&#xff0c;如果给U盘安装需要balenaEtcher或者rufus&#xff08;U盘安装还需要ChipGenus&#xff09;&#xff0c;如果给硬盘安装需要有pe推荐firePE或U启通 我以U盘为例 首先去找这…