wyh的迷宫

涉及知识点:求迷宫能否到达终点的,而不是求路径数的,用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.mzph.cn/news/675212.shtml

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

相关文章

PHPExcel导出excel

PHPExcel下载地址 https://gitee.com/mirrors/phpexcelhttps://github.com/PHPOffice/PHPExcel 下载后目录结构 需要的文件如下图所示 将上面的PHPExcel文件夹和PHPExcel.php复制到你需要的地方 这是一个简单的示例代码 <?php$dir dirname(__FILE__); //require_once …

CloudStack Agent重新安装与卸载指南

在云计算环境中&#xff0c;CloudStack是一个流行的开源云管理平台。作为CloudStack架构中的关键组件&#xff0c;CloudStack Agent负责在虚拟机&#xff08;VM&#xff09;上执行来自CloudStack管理服务器的命令。本文将指导您如何重新安装和卸载CloudStack Agent。 卸载Clou…

l + r >> 1; 的含义

void merge_sort(int q[],int l,int r){//递归的终止情况if(l>r)return;//第一步&#xff1a;分成子问题int mid lr>>1;//第二步&#xff1a;递归处理子问题merge_sort(q, l, mid), merge_sort(q, mid1, r);//第三步&#xff1a;合并子问题int k 0, i l, j mid1;…

【前后端接口AES+RSA混合加解密详解(vue+SpringBoot)附完整源码】

前后端接口AES+RSA混合加解密详解(vue+SpringBoot) 前后端接口AES+RSA混合加解密一、AES加密原理和为什么不使用AES加密二、RSA加密原理和为什么不使用rsa加密三、AES和RSA混合加密的原理四、代码样例前端1. 请求增加加密标识2. 前端加密工具类3.前端axios请求统一封装,和返…

Unity3d Shader篇(五)— Phong片元高光反射着色器

文章目录 前言一、Phong片元高光反射着色器是什么&#xff1f;1. Phong片元高光反射着色器的工作原理2. Phong片元高光反射着色器的优缺点优点缺点 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数 三、效果四、总…

ChatGPT升级版本GPT-4V(ision)支持多模态语音和图像

ChatGPT升级指南&#xff1a;迎接GPT-4V(ision)的全新多模态时代 ChatGPT最新升级引入了GPT-4V(ision)&#xff0c;这是一个突破性的多模态版本&#xff0c;支持语音和图像输入。现在&#xff0c;用户可以与ChatGPT进行更加丰富和互动的对话。以下是您升级到GPT-4V(ision)所需…

机器学习7-K-近邻算法(K-NN)

K-Nearest Neighbors&#xff08;K-近邻算法&#xff0c;简称KNN&#xff09;是一种基本的监督学习算法&#xff0c;用于解决分类和回归问题。KNN的核心思想是基于距离度量&#xff0c;在特征空间中找到最近的K个样本&#xff0c;然后使用它们的标签进行决策。以下是KNN的基本概…

SpringBoot WebSocket客户端与服务端一对一收发信息

依赖 <!--websocket--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>配置类 Configuration public class WebSocketConfig {Bean //方法返回值交…

微软.NET6开发的C#特性——委托和事件

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦&#xff0c;我决定做点什么&#xff0c;下面我就重点讲讲微软.NET6开发人员需要知道的C#特性&#xff0c;然后比较其他各种语言进行认识。 C#经历了多年发展…

【Spring源码解读!底层原理进阶】【上】探寻Spring内部:BeanFactory和ApplicationContext实现原理揭秘✨

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;底层原理高级进阶》 &#x1f680…

Docker部署前端项目

某次阿里云的自动流水线失败了&#xff0c;代码本地跑起来莫得问题&#xff0c;错误日志提示让我跑一下npm run build &#xff0c;但是俺忽然发现&#xff0c;我跑了&#xff0c;文件打包好了&#xff0c;但是往哪里运行呢&#xff1f;这涉及到要构建一个环境供打包文件部署吧…

【Linux】线程池线程安全的单例模式和STL读者写者问题

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 线程池1.1 线程池是什么1.2 为什么要有线程池1.3 线程池的应用场景1.4 线程池的任…

ONLYOFFICE文档8.0新功能浅探

ONLYOFFICE文档8.0新功能浅探 上个月末这个月初的几天&#xff0c;ONLYOFFICE版本更新了&#xff01;更新到了一个比较整的大的版本号&#xff0c;8.0版本&#xff0c;看来这个生产力工具的升级速度基本上能保持每年两个版本号的速度&#xff0c;还是很快的&#xff0c;一般来…

【算法题】97. 交错字符串

题目 给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串&#xff1a; s s1 s2 ... sn t t1 t2 ... tm |n - m| < 1 交…

速盾:海外服务器用了cdn还是卡怎么办

海外服务器使用CDN卡顿问题的解决办法 在如今互联网高速发展的时代&#xff0c;海外服务器成为了许多企业和个人用户的首选&#xff0c;因为它能够提供更高的带宽和更稳定的网络连接。然而&#xff0c;尽管海外服务器在网络性能方面表现出色&#xff0c;但在使用过程中仍然可能…

【stomp实战】websocket原理解析与简单使用

一、WebSocket 原理 WebSocket是HTML5提供的一种浏览器与服务器进行全双工通讯的网络技术&#xff0c;属于应用层协议。它基于TCP传输协议&#xff0c;并复用HTTP的握手通道。浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直接可以创建持久性的连接&#xff0c; 并…

多线程JUC:等待唤醒机制(生产者消费者模式)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;多线程&JUC&#xff1a;解决线程安全问题——synchronized同步代码块、Lock锁 &#x1f4da;订阅专栏&#xff1a;多线程&am…

Kubernetes实战(二十七)-HPA实战

1 HPA简介 HPA 全称是 Horizontal Pod Autoscaler&#xff0c;用于POD 水平自动伸缩&#xff0c; HPA 可以 基于 POD CPU 利用率对 deployment 中的 pod 数量进行自动扩缩容&#xff08;除了 CPU 也可以基于自定义的指标进行自动扩缩容&#xff09;。pod 自动缩放不适用于无法…

NGINX upstream、stream、四/七层负载均衡以及案例示例

文章目录 前言1. 四/七层负载均衡1.1 开放式系统互联模型 —— OSI1.2 四/七层负载均衡 2. Nginx七层负载均衡2.1 upstream指令2.2 server指令和负载均衡状态与策略2.2.1 负载均衡状态2.2.2 负载均衡策略 2.3 案例 3. Nginx四层负载均衡的指令3.1 stream3.2 upstream指令3.3 四…

深入理解ES的倒排索引

目录 数据写入过程 词项字典 term dictionary 倒排表 posting list FOR算法 RBM算法 ArrayContainer BitMapContainer 词项索引 term index 在Elasticsearch中&#xff0c;倒排索引的设计无疑是惊为天人的&#xff0c;下面看下倒排索引的结构。 倒排索引分为词项索引【…