题目详情
思路
我们采用回溯的方法解决这个问题,无脑四个方向去试探,如果能走就继续试探,直到走出迷宫,如果当前位置已经走到了死胡同,我们就回到刚刚没走到这个位置的位置,向其他方向试探。
框架代码:
为避免回溯函数参数过多引起混乱,建议将数组,行列声明为全局变量。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int ROW,COL;
vector<vector<int>> maze;
vector<vector<int>> path_tmp;
vector<vector<int>> path_bst;
回溯的核心代码:
void backTrack(int i,int j)
{
maze[i][j] = 1;//表示已经走过这里了
path_tmp.push_back({
i,j});
//判断是否走到最后
if(i == ROW-1 && j == COL-1)
{
if(path_bst.empty() || path_tmp.size() < path_bst.size())
{
path_bst = path_tmp;
}
}
//右
if(j+1 < COL && maze[i][j+1] == 0)
backTrack(i, j+1);
//上
if(i-1 >= 0 && maze[i-1][j] == 0)
backTrack(i-1, j);
//下
if(i+1 < ROW && maze[i+1][j] == 0)
backTrack(i+1, j);
//左
if(j-1 >= 0 && maze[i][j-1] == 0)
backTrack(i, j-1);
//无路可走就回溯了
maze[i][j] = 0;
path_tmp.pop_back();
}
参考代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int ROW,COL;
vector<vector<int>> maze;
vector<vector<int>> path_tmp;
vector<vector<int>> path_bst;
void backTrack(int i,int j)
{
maze[i][j] = 1;
path_tmp.push_back({
i,j});
//判断是否走到最后
if(i == ROW-1 && j == COL-1)
{
if(path_bst.empty() || path_tmp.size() < path_bst.size())
{
path_bst = path_tmp;
}
}
//右
if(j+1 < COL && maze[i][j+1] == 0)
backTrack(i, j+1);
//上
if(i-1 >= 0 && maze[i-1][j] == 0)
backTrack(i-1, j);
//下
if(i+1 < ROW && maze[i+1][j] == 0)
backTrack(i+1, j);
//左
if(j-1 >= 0 && maze[i][j-1] == 0)
backTrack(i, j-1);
//无路可走就回溯了
maze[i][j] = 0;
path_tmp.pop_back();
}
int main()
{
while(cin >> ROW >> COL)
{
//构造迷宫
maze = vector<vector<int>> (ROW,vector<int> (COL,0));
for(int i = 0;i<ROW;i++)
for(int j = 0;j<COL;j++)
cin >> maze[i][j];
//从0,0开始寻找
backTrack(0,0);
for(int i = 0;i<path_bst.size();i++)
{
printf("(%d,%d)\n",path_bst[i][0],path_bst[i][1]);
}
path_bst.clear();
path_tmp.clear();
}
return 0;
}