之前写过一篇关于利用深度优先搜索实现迷宫寻宝的例子,下面把这个例子改进了一下,通过广度优先搜索实现寻宝,先看看效果:
深度优先搜索算法主要使用队列,通过队列保存已经扫描过的区域,即使用一层一层扩展的方法找到目标。每一个点的外层的搜索都是按照顺时针方向实现的:右下左上
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();
}
}
}