【dfs】01迷宫

本文介绍了如何使用深度优先搜索(DFS)解决一个关于01迷宫的题目。在迷宫中,0表示可以移动的位置,1表示障碍。从起点开始,任务是计算可以到达的格子数量。给出了题目的输入输出格式、样例及解题思路,强调了DFS在解决这类问题上的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目传送门P1141

题目描述

有一个仅由数字0与1组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。

你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。

输入输出格式

输入格式:

第1行为两个正整数n,m。

下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格。

接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第ii行第jj列的一个格子,询问从这一格开始能移动到多少格。

输出格式:

m行,对于每个询问输出相应答案。

输入输出样例

输入样例#1:

2 2
01
10
1 1
2 2

输出样例#1:

4
4

说明

所有格子互相可达。

对于20\%20%的数据,n≤10;

对于40\%40%的数据,n≤50;

对于50\%50%的数据,m≤5;

对于60\%60%的数据,n≤100,m≤100;

对于100\%100%的数据,n≤1000,m≤100000。

题解

这道题非常简单,就是最基础的搜索。

另外提一句,我发现我喜欢用dfs做bfs的题。。不知道为什么。。

AC代码

### 迷宫问题的DFS解决方案 深度优先搜索(Depth First Search, DFS)是一种常用的图遍历算法,在解决迷宫问题时非常有效。以下是基于提供的引用以及专业知识整理的一个完整的解决方案。 #### 1. 基本思路 DFS的核心在于通过递归的方式探索所有的可能路径,直到找到目标位置或者确认无路可走为止。对于迷宫问题来说,通常会定义一个二维数组表示地图,其中 `0` 表示可以通过的位置,而 `1` 或其他标记则代表障碍物[^1]。 为了实现这一功能,可以采用如下策略: - 定义四个移动方向:上、下、左、右。 - 使用递归来尝试每一步的可能性,并在遇到死胡同时返回前一状态继续探索新的分支[^4]。 #### 2. 实现细节 下面给出了一种典型的C++代码实现方式: ```cpp #include <iostream> #include <vector> using namespace std; // 方向数组,分别对应上下左右四个方向 const vector<pair<int, int>> directions = { { -1, 0 }, // 上 { 1, 0 }, // 下 { 0, -1 }, // 左 { 0, 1 } // 右 }; bool isValidMove(int newRow, int newCol, const vector<vector<int>>& maze, vector<vector<bool>>& visited) { int rows = maze.size(); int cols = maze[0].size(); return newRow >= 0 && newRow < rows && newCol >= 0 && newCol < cols && !maze[newRow][newCol] && !visited[newRow][newCol]; } bool dfs(vector<vector<int>>& maze, vector<vector<bool>>& visited, pair<int, int> currentPos, pair<int, int> target) { if (currentPos.first == target.first && currentPos.second == target.second){ return true; } for(auto& dir : directions){ int newRow = currentPos.first + dir.first; int newCol = currentPos.second + dir.second; if(isValidMove(newRow, newCol, maze, visited)){ visited[newRow][newCol] = true; if(dfs(maze, visited, make_pair(newRow, newCol), target)){ return true; } // 如果该条路径不通,则回溯到之前的状态并尝试另一条路径 } } return false; } int main(){ vector<vector<int>> maze = { {0, 1, 0, 0}, {0, 1, 0, 1}, {0, 0, 0, 0}, {0, 1, 1, 0} }; pair<int,int> start = {0,0}; pair<int,int> end = {3,3}; int nRows = maze.size(); int nCols = maze[0].size(); vector<vector<bool>> visited(nRows, vector<bool>(nCols, false)); bool result = dfs(maze, visited, start, end); cout << (result ? "Path found!" : "No path exists.") << endl; return 0; } ``` 上述程序中包含了几个重要部分: - **方向数组**用于指定每次可以从当前位置出发到达的新坐标; - **isValidMove函数**用来判断下一步是否合法; - **dfs函数**实现了核心逻辑,即不断深入直至达到目的地或穷尽所有可能性后退出[^2]。 #### 3. 关键点解析 - **边界条件处理**: 需要特别注意越界情况以及访问过的节点不能再重复进入以免陷入无限循环[^3]。 - **回溯机制**: 当某一条路线无法通达终点时,应回退至上一层重新选择未被尝试的方向前进。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值