Qt利用广度优先搜索实现迷宫寻宝

之前写过一篇关于利用深度优先搜索实现迷宫寻宝的例子,下面把这个例子改进了一下,通过广度优先搜索实现寻宝,先看看效果:
在这里插入图片描述

深度优先搜索算法主要使用队列,通过队列保存已经扫描过的区域,即使用一层一层扩展的方法找到目标。每一个点的外层的搜索都是按照顺时针方向实现的:右下左上

void UserMaze::findByBFS() {
	int next[4][2] = {//按照顺时针方向搜索
		{ 0,1 },//向右
		{ 1,0 },//向下
		{ 0,-1 },//向左
		{ -1,0 }//向上
	};

	_queueBFS.push(SignalGrid(0, 0));//把第一个元素压入队列
	_book[0][0] = 1;//第一个元素已经使用标记

	int tx = -1, ty = -1;//当前方格位置
	bool findIt = false;//找到标志
	while (_queueBFS.size() > 0) {
		for (int l = 0; l < 4;l++) {
			tx = _queueBFS.front().getRow() + next[l][0];
			ty = _queueBFS.front().getCol() + next[l][1];

			//判断是否越界
			if (tx < 0 || tx >= _rowCount || ty < 0 || ty >= _colCount) {
				continue;
			}

			if (_maze[tx][ty].getGridType() != SGT_LOCK&& _book[tx][ty] == 0) {
				
				if (tx == _targetX&& ty == _targetY) {
					findIt = true;
					break;
				}
				_book[tx][ty] = 1;

				//如果是通路,则保存进队列中,如果不是通路在直接忽略
				if (_maze[tx][ty].getGridType() == SGT_UNLOCK){
					_queueBFS.push(SignalGrid(tx, ty));

					_maze[tx][ty].setGridType(SGT_FIND);
					_update->updateMaze();
					QThread::msleep(200);
					_maze[tx][ty].setGridType(SGT_UNLOCK);
					_update->updateMaze();
				}
			}
		}

		if (findIt){
			break;
		} else {
			_queueBFS.pop();
		}
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值