cpp实现走迷宫游戏

走迷宫

        时间限制: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.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值