题解 | #迷宫问题#
迷宫问题
http://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc
比较经典的回溯问题
主程序调用回溯算法,为了避免回溯函数中参数过多,可以将部分参数设置为全局
以下是我的解答
#include <vector>
using namespace std;
bool findPath(int i, int j, vector<vector<int>>& path, vector<vector<int>>& vin, vector<vector<bool>>& isvisited);
vector<vector<int>> dirs = {{0,1}, {0,-1}, {1,0}, {-1,0}};
int main(){
int n, m;
cin >> n >> m;
vector<vector<int>> vin(n, vector<int>(m, 0));
while(cin){
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cin >> vin[i][j];
}
}
}
auto printij = [&](int i, int j){
cout << '(' << i << ',' << j << ')' << endl;
};
vector<vector<int>> path;
path.push_back({0,0});
vector<vector<bool>> isvisited(n, vector<bool>(m, false));
findPath(0, 0, path, vin, isvisited);
for(auto& x : path){
printij(x[0], x[1]);
}
return 0;
}
bool findPath(int i, int j, vector<vector<int>>& path, vector<vector<int>>& vin, vector<vector<bool>>& isvisited){
if(i==vin.size()-1 && j==vin[0].size()-1){
return true;
}
// path.push_back({i,j});
for(auto& x : dirs){
int nexti = i + x[0];
int nextj = j + x[1];
if(nexti>=0 && nexti<vin.size() && nextj>=0 && nextj<vin[0].size() && !isvisited[nexti][nextj]){
if(vin[nexti][nextj]==0){
path.push_back({nexti,nextj});
isvisited[nexti][nextj] = true;
if(findPath(nexti, nextj, path, vin, isvisited)){
return true;
}
path.pop_back();
isvisited[nexti][nextj] = false;
}
}
}
return false;
}