LeetCode-490 迷宫问题(DFS)

server/2025/3/20 18:12:52/

题目描述

由空地和墙组成的迷宫中有一个球,球可以向上下左右四个方向滚动,但在遇到墙壁前不会停止滚动。当球停下时,可以选择下一个方向。给定球的起始位置、目的地和迷宫。判断球能否在目的地停下。

思路分析:
迷宫由一个0和1的二维数组组成,1表示墙壁,0代表空地。你可以假设迷宫的边缘都是墙壁,防止小球出界,起始位置和目的地的坐标通过行号和列好给出。

该题特别注意,小球是向一个方向运动,直到停下为止,并不是一次只运动一格。

示例一:

输入 1: 迷宫由以下二维数组表示0 0 1 0 0
0 0 0 0 0
0 0 0 1 0
1 1 0 1 1
0 0 0 0 0输入 2: 起始位置坐标 (rowStart, colStart) = (0, 4)
输入 3: 目的地坐标 (rowDest, colDest) = (4, 4)输出: true解析: 一个可能的路径是 : 左 -> 下 -> 左 -> 下 -> 右 -> 下 -> 右。

示例二:

输入 1: 迷宫由以下二维数组表示0 0 1 0 0
0 0 0 0 0
0 0 0 1 0
1 1 0 1 1
0 0 0 0 0输入 2: 起始位置坐标 (rowStart, colStart) = (0, 4)
输入 3: 目的地坐标 (rowDest, colDest) = (3, 2)输出: false解析: 没有能够使球停在目的地的路径。注意:
迷宫中只有一个球和一个目的地。
球和目的地都在空地上,且初始时它们不在同一位置。
给定的迷宫不包括边界 (如图中的红色矩形), 但你可以假设迷宫的边缘都是墙壁。
迷宫至少包括2块空地,行数和列数均不超过100。
class Solution{
public:int dirx[4] = {0,1,0,-1},diry[4]={1,0,-1,0};int visit[101][101],ex,ey,n,m;bool hasPath(vector<vector<int>>& maze,vector<int>& start,vector<int>& destination){//把start和destination的输入当成了一个一维数组int sx=start[0],sy=start[1];//起始坐标n=maze.size();//整个地图的大小m=maze[0].size();//地图一行的大小ex=destination[0],ey=destination[1]; //终点坐标memset(visit,0,sizeof(visit));//分配一个101*101的内存空间给visit数组visit[sx][sy]=1;//在visit当中标记起始点的坐标if(DFS(sx,sy,maze))   return true;//如果能在目的地停下,则返回trueelse return false;}bool DFS(int x,int y,const vector<vector<int>> &maze){if(x==ex && y==ey)        return true;//抵达终点  for(int i=0;i<4;i++){int dx=x+dirx[i];int dy=y+diry[i];while(dx>=0 && dx<n && dy>=0 && dy<m && maze[dx][dy]==0)//保持当前方向,遇到障                            //碍物之前一直往此方向走{dx=dx+dirx[i];dy=dy+diry[i];}//因为上述while循环多执行了一步,走到了障碍物那个位置,故需要退一步。dx=dx-dirx[i];dy=dy-diry[i];if(visit[dx][dy])  continue;visit[dx][dy]=1;bool flag = DFS(dx,dy,maze);//递归调用if(flag)  return true;}return false;}
}

 最短路径-迷宫问题(DFS---迷宫问题_牛客题霸_牛客网)

#include<stdio>
int n,m,a[105][105],dx[]={0,-1,1,0},dy[]={1,0,0,-1};
struct node{int x,y;};
bool vis[105][105],g=false;
vector<node> q;void dfs(int x,int y)
{if(g) return;//如果到达终点,则输出存储到q栈当中的路径if(x==n-1 && y==m-1)  {g=true;for(int i=0;i<(int)q.size();i++)printf("(%d,%d)\n",q[i].x,q[i].y);//cout<<'('<<q[i].x<<','<<q[i].y<<')'<<endl;return;}if(x>0 && x<n && y>0 && y<m && vis[x][y]==0){vis[x][y]=true;q.push_back({x,y});dfs(x,y);q.pop_back();vis[x][y]=false;}
}int main(){scanf("%d%d",&n,&m);for(int i=0;i<n;i++)for(int j=0;j<m;j++)scanf("%d",&a[i][j]);q.push_back({0,0});vis[0][0]=true;dfs(0,0);
}


http://www.ppmy.cn/server/176560.html

相关文章

DeepSeek私有化部署与安装浏览器插件内网穿透远程访问实战

文章目录 前言1. 本地部署OllamaDeepSeek2. Page Assist浏览器插件安装与配置3. 简单使用演示4. 远程调用大模型5. 安装内网穿透6. 配置固定公网地址 前言 最近&#xff0c;国产AI大模型Deepseek成了网红爆款&#xff0c;大家纷纷想体验它的魅力。但随着热度的攀升&#xff0c…

rip 协议详细介绍

以下是关于 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09; 的详细介绍&#xff0c;涵盖其工作原理、版本演进、配置方法、优缺点及实际应用场景。 1. RIP 协议概述 类型&#xff1a;动态路由协议&#xff0c;基于距离矢量算法&#xff08…

MySQL -- 复合查询

数据库的查询是数据库使用中比较重要的环节&#xff0c;前面的基础查询比较简单&#xff0c;不做介绍&#xff0c;可自行查阅。本文主要介绍复合查询&#xff0c;并结合用例进行讲解。 本文的用例依据Soctt模式的经典测试表&#xff0c;可以自行下载&#xff0c;也可以自己创建…

AI赋能生态学:ChatGPT+多技术融合在生态系统服务中的实践探索与学术写作

查看原文 >>> AI赋能生态学&#xff1a;ChatGPT多技术融合在生态系统服务中的实践探索与学术写作 第一章&#xff1a;AI在生态科研中的应用、文献调研与研究设计 1、AI在生态科研中的作用 l介绍AI基本概念&#xff1a;机器学习、深度学习、自然语言处理&#xff08;…

应用商店上新:Couchbase Enterprise Server集群

可移植的冗余数据平台&#xff0c;这往往是创建可扩展的云原生应用程序的先决条件。而不依赖特定平台的工具可用于为多云、多区域工作负载提供企业级应用所需的灵活性。 ​Couchbase是一种高性能NoSQL数据库&#xff0c;专为当今复杂的云生态系统所需的动态扩展能力而设计。最近…

4、linux c 进程

【三】进程 1. 进程与程序的区别 程序&#xff1a;存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09;&#xff0c;是静态的。 进程&#xff1a;执行一个程序所分配的资源的总称&#xff0c;是动态的。 2. 进程的组成部分 BSS段&#xff08;bss&#xff09;&…

AI绘画软件Stable Diffusion详解教程(11):图生图进阶篇(局部用上传蒙版重绘)

总的功能与上一篇相似&#xff0c;但是在Stable Diffusion网页上手工涂绘的方法&#xff0c;有可能会因不够精细&#xff0c;导致重绘的效果不佳&#xff0c;涂绘区与非涂绘区的衔接有可能会出问题。这个时候可以用photoshop来制作蒙版&#xff0c;精确的圈出需要重绘的地方&am…

监控推特信息并发送到微信

循环尝试连接:尝试最多 5 次连接 API,如果成功获取数据则退出循环。 API 请求: 使用 http.client.HTTPSConnection 连接到 twitter154.p.com。 设置 API 的认证头(x--key 和 x-host)。 发送 GET 请求,获取用户 的最新 20 条推文。 解析返回的 JSON 数据。 异常处理:如果…