编辑
2024-09-22
算法题
00
请注意,本文编写于 229 天前,最后修改于 229 天前,其中某些信息可能已经过时。

目录

迷宫
题目描述
输入格式
输出格式
样例 #1
样例输入 #1
样例输出 #1
提示

今天做迷宫https://www.luogu.com.cn/problem/P1605

迷宫

题目描述

给定一个 N×MN \times M 方格的迷宫,迷宫里有 TT 处障碍,障碍处不可通过。 在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。 给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。

输入格式

第一行为三个正整数 N,M,TN,M,T,分别表示迷宫的长宽和障碍总数。 第二行为四个正整数 SX,SY,FX,FYSX,SY,FX,FYSX,SYSX,SY 代表起点坐标,FX,FYFX,FY 代表终点坐标。 接下来 TT 行,每行两个正整数,表示障碍点的坐标。

输出格式

输出从起点坐标到终点坐标的方案总数。

样例 #1

样例输入 #1

2 2 1 1 1 2 2 1 2

样例输出 #1

1

提示

对于 100%100\% 的数据,1N,M51 \le N,M \le 51T101 \le T \le 101SX,FXn1 \le SX,FX \le n1SY,FYm1 \le SY,FY \le m

cpp
#include <iostream> using namespace std; const int MAXN = 5; const int MAXM = 5; int N, M, T; int SX, SY, FX, FY; bool maze[MAXN + 1][MAXM + 1]; // false 表示可以通过,true 表示障碍 bool visited[MAXN + 1][MAXM + 1]; // 记录是否访问过 int dx[] = {0, 0, 1, -1}; // 右、左、下、上 int dy[] = {1, -1, 0, 0}; int dfs(int x, int y) { if (x == FX && y == FY) { return 1; // 到达终点,返回1表示找到一条路径 } visited[x][y] = true; // 标记当前位置为已访问 int count = 0; for (int i = 0; i < 4; ++i) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx >= 1 && nx <= N && ny >= 1 && ny <= M && !maze[nx][ny] && !visited[nx][ny]) { count += dfs(nx, ny); // 递归搜索下一个位置 } } visited[x][y] = false; // 回溯,取消当前位置的访问标记 return count; } int main() { cin >> N >> M >> T; cin >> SX >> SY >> FX >> FY; // 初始化迷宫 for (int i = 1; i <= N; ++i) { for (int j = 1; j <= M; ++j) { maze[i][j] = false; visited[i][j] = false; } } // 读取障碍点 for (int i = 0; i < T; ++i) { int x, y; cin >> x >> y; maze[x][y] = true; } // 从起点开始DFS int result = dfs(SX, SY); cout << result << endl; return 0; }

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!