走迷宫
时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 128MB,其他语言 256MB
描述
一个迷宫可用类似于如下的一个二维数组来描述
.#..#
.#..#
.#..#
#.#..
#....
图中,’.’ 表示可行走的通路,’#’ 表示障碍物,不可行走,也不可穿越。走迷宫时,只有上下左右四个方向可以行走,不可以斜着走。
假设此迷宫的入口坐标为 (0,0)(左上角),出口坐标为 (4,4)(右下角),则此迷宫可以通过如下的坐标序列(也可称为路径),从入口走到出口:
(0,0)→(1,0)→(2,0)→(2,1)→(2,2)→(2,3)→(3,3)→(3,4)→(4,4)
显然,此迷宫的路径不止一条。
你的任务
要判断所给的迷宫是否有解,即是否存在至少一条从入口到出口的通路坐标序列。
输入描述
第一行是 2 个整数 m,n ,表示迷宫的长度和宽度。0<m,n≤50
第二行是 4 个整数 a,b,c,d,其中 (a,b) 表示迷宫的入口坐标,(c,d) 表示出口坐标。
接下来是 m 行,每行 n 列。表示一个迷宫。
输出描述
如果该迷宫有解,则输出 YES,否则输出 NO。
用例输入
5 5
0 0 4 4
.#..#
.#..#
....#
#.#..
#....
用例输出
YES
示例
下面是我的代码示例,仅供参考,请主要学习其中思想。
#include <iostream>
using namespace std;
class maze
{
public:
// 有参开辟空间
maze(const int m, const int n)
{
this->m = m;
this->n = n;
map = new char *[m];
for (int i = 0; i < m; ++i)
map[i] = new char[n];
player = new bool *[m];
for (int i = 0; i < m; ++i)
player[i] = new bool[n];
}
// 地图制作
bool mapmaking()
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cin >> map[i][j];
if (map[i][j] == '#')
player[i][j] = false;
else
player[i][j] = true;
}
}
return true;
}
// 检查坐标是否有效
bool is_valid(int x, int y)
{
return (x >= 0 && x < m && y >= 0 && y < n && player[x][y]);
}
// 使用深度优先搜索检测路径是否存在
bool ispath(int x, int y, int dest_x, int dest_y)
{
if (x == dest_x && y == dest_y)
{
return true; // 到达出口
}
if (is_valid(x, y))
{
player[x][y] = false; // 标记为已访问
// 向上移动
if (ispath(x - 1, y, dest_x, dest_y))
return true;
// 向下移动
if (ispath(x + 1, y, dest_x, dest_y))
return true;
// 向左移动
if (ispath(x, y - 1, dest_x, dest_y))
return true;
// 向右移动
if (ispath(x, y + 1, dest_x, dest_y))
return true;
return false; // 四个方向都无法到达出口
}
return false; // 坐标无效
}
private:
char **map; // 迷宫地图,二维
bool **player; // 玩家路径图
int m; // 行数
int n; // 列数
};
int main()
{
int m, n;
cin >> m >> n;
int a, b, c, d;
cin >> a >> b >> c >> d;
maze game(m, n);
game.mapmaking();
cout << (game.ispath(a, b, c, d) ? "YES" : "NO") << endl;
return 0;
}
作者
Qiujerry, in Kwangtung.