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.hqwc.cn/news/460768.html

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

相关文章

python-产品篇-游戏-象棋

文章目录 代码效果 代码 import pygame import time import constants from button import Button import pieces import computerclass MainGame():window NoneStart_X constants.Start_XStart_Y constants.Start_YLine_Span constants.Line_SpanMax_X Start_X 8 * Lin…

读千脑智能笔记07_人工智能的未来(中)

1. 机器智能的未来 1.1. 没有任何技术原因阻止我们创造智能机器 1.1.1. 障碍在于我们缺乏对智能的理解&#xff0c;也不知道产生智能所需的机制 1.2. 历史表明&#xff0c;我们无法预测将推动机器智能向前发展的技术进步 1.2.1. …

【数据结构】链表OJ面试题2《分割小于x并排序链表、回文结构、相交链表》+解析

1.前言 前五题在这http://t.csdnimg.cn/UeggB 休息一天&#xff0c;今天继续刷题&#xff01; 2.OJ题目训练 1. 编写代码&#xff0c;以给定值x为基准将链表分割成两部分&#xff0c;所有小于x的结点排在大于或等于x的结点之前 。链表分割_牛客题霸_牛客网 思路 既然涉及…

深入理解原码、反码和补码

文章目录 前言原码反码补码原码、反码、补码之间的转换为什么需要反码和补码&#xff1f; 前言 在计算机领域&#xff0c;经常会听到原码、反码和补码这些概念。这些概念是计算机中对数值进行存储和运算的基础。本文将深入探讨这些概念&#xff0c;解释它们的定义、特点以及在…

黑马程序员——html css基础——day09——CSS高级

目录&#xff1a; 定位 相对定位&#xff1a;绝对定位定位居中固定定位堆叠层级z-index高级技巧 CSS精灵案例-写出自己的名字字体图标下载字体使用字体CSS修饰属性 垂直对齐方式过渡表单获得焦点选择器focus透明度opacity光标类型cursor禁用鼠标样式表格样式-合并相邻两个边框…

第59讲订单数据下拉实现

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;/*** 订单查询 type值 0 全部订单 1待付款 2 待收货 3 退款/退货* param type* return*/RequestMapping("/list")public R list(Integer type,Integer page,Integer pageSize){System.out.pri…

使用 Docker 镜像预热提升容器启动效率详解

概要 在容器化部署中,Docker 镜像的加载速度直接影响到服务的启动时间和扩展效率。本文将深入探讨 Docker 镜像预热的概念、必要性以及实现方法。通过详细的操作示例和实践建议,读者将了解如何有效地实现镜像预热,以加快容器启动速度,提高服务的响应能力。 Docker 镜像预热…

传输层协议 ——— TCP协议

TCP协议 TCP协议谈谈可靠性为什么网络中会存在不可靠&#xff1f;TCP协议格式TCP如何将报头与有效载荷进行分离&#xff1f;序号与确认序号 确认应答机制&#xff08;ACK&#xff09;超时重传机制连接管理机制三次握手四次挥手 流量控制滑动窗口拥塞控制延迟应答捎带应答面向字…

关于使用sort函数来快排的几种使用方法(总结)

sort 函数是一个极好的排序函数&#xff0c;因为其运行速度块&#xff0c;占用内存少&#xff0c;排序也省力&#xff0c;深受程序员们的喜爱&#xff0c;具体用法这里就不再多介绍了&#xff0c;今天主要强调以下几点快排&#xff1a; 1.从大到小快排&#xff1a; #include &…

数字图像处理实验记录九(数字形态学实验)

一、基础知识 1.形态学&#xff0c;用于从图像中提取对表达和描绘区域形状有意义的图像分量&#xff0c;使后续的识别工作能够抓住目标对象最为有本质的形状特征&#xff0c;如边界连通区域等。 2.膨胀运算&#xff1a;膨胀会使目标区域范围“变大”&#xff0c;将于目标区域接…

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

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

20240203在WIN10下使用GTX1080配置stable-diffusion-webui.git不支持float16精度出错的处理

20240203在WIN10下使用GTX1080配置stable-diffusion-webui.git不支持float16精度出错的处理 2024/2/3 21:23 缘起&#xff1a;最近学习stable-diffusion-webui.git&#xff0c;在Ubuntu20.04.6下配置SD成功。 不搞精简版本&#xff1a;Miniconda了。直接上Anacoda&#xff01; …