迷宫老鼠
程序员文章站
2023-12-24 20:43:39
...
1.迷宫老鼠问题是要寻找一条从入口到从出口的路径。
2.设计思路:
假定用n×m的矩阵来描述迷宫,位置(1,1)表示入口,(n,m)表示出口,n和m分别代表迷宫的行数和列数。
迷宫中的每个位置都可用其行号和列号来指定。在矩阵中,当且仅当在位置(i,j)处有一个障碍时其值为1,否则其值为0。
效果图:
1.偏移量: 创建一个偏移量(类型为position)数组专门记录移动操作的偏移量。
//初始化偏移量,用position的形式定义了右下左上的移动方式。
position offset[4];
offset[0].row = 0;offset[0].col = 1;
offset[1].row = 1;offset[1].col = 0;
offset[2].row = 0;offset[2].col = -1;
offset[3].row = -1;offset[3].col = 0;
2.每次移动操作:
定义option为0,lastoption为3。表示从右到上依次尝试。
while (option<=lastOption){
r = here.row+offset[option].row;
c = here.col+offset[option].col;
if (maze[r][c] == 0) break;
option++;
}
3.找到/没找到 相邻的通路后:
1)有通路:
if (option<=lastOption){//相邻的有通路
path->push(here);
here.row = r;
here.col = c;
maze[r][c] = 1;//设置为1,防止重复访问
option = 0;
}
2)无通路:
else{
if (path->empty()) return false;//退无可退
position next = path->top();//取出上一个节点
path->pop();
if (next.row==here.row){
option = 2+next.col-here.col;//返回的是左相邻或者是右相邻
} else {
option = 3+next.row-here.row;//返回的是上相邻或者下相邻
}
}
如果最后能够执行完while循环表示可以找到通路,此时栈中存的就是到终点的路径(不包含终点)。