题解 | #迷宫问题#
迷宫问题
https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc
可以使用深度搜索DFS来解决迷宫探索问题(广度搜索待研究)
实现DFS可以利用stack,也可以使用递归(本身就是一种压栈方式)。这里使用递归来完成。
设计递归函数时,考虑需要判断每个节点是否在通路上,故返回值定为bool。
而对于每个节点bool值的确定,利用递归进行深度搜索:上、下、左、右四个邻近节点进行探索。当这四个方向节点都不是通路,则说明该节点也不通,状态记为2。
同时,为了避免走重复节点,函数需要记录上一个节点坐标(bef_row, bef_col),防止下一步移动走回去。
遇到的bug:
- 条件判断时优先判断下一步是否移动回去,再递归判断下一步是否在通路上
- 判断下一步是否移动回去,row和col不等关系使用||,而不是&&,只要有一个不同即可
#include <cstdio>
#include <iostream>
#include <utility>
#include <vector>
using namespace std;
bool walkMap(vector< vector<int> > & map, int now_row, int now_col, int bef_row, int bef_col, vector<pair<int, int> >& store){
int len_row = size(map);
int len_col = size(map[0]);
if(now_row == len_row-1 && now_col == len_col-1){
store.push_back(make_pair(now_row, now_col));
return true;
}
else if(now_row >= 0 && now_row < len_row && now_col >= 0 && now_col < len_col
&& map[now_row][now_col] != 1 && map[now_row][now_col] != 2){
// map[bef_row][bef_col] = 2;
if((now_row+1 != bef_row || now_col != bef_col)
&& walkMap(map, now_row+1, now_col, now_row, now_col, store)){
// cout << "down: " << "(" << now_row << " , " << now_col << ") " << endl;
store.push_back(make_pair(now_row, now_col));
return true;
}else if((now_row-1 != bef_row || now_col != bef_col)
&& walkMap(map, now_row-1, now_col, now_row, now_col, store)){
// cout << "up: " << "(" << now_row << " , " << now_col << ") " << endl;
store.push_back(make_pair(now_row, now_col));
return true;
}else if((now_row != bef_row || now_col+1 != bef_col)
&& walkMap(map, now_row, now_col+1, now_row, now_col, store)){
// cout << "right: " << "(" << now_row << " , " << now_col << ") " << endl;
store.push_back(make_pair(now_row, now_col));
return true;
}else if((now_row != bef_row || now_col-1 != bef_col)
&& walkMap(map, now_row, now_col-1, now_row, now_col, store)){
// cout << "left: " << "(" << now_row << " , " << now_col << ") " << endl;
store.push_back(make_pair(now_row, now_col));
return true;
}else{
map[now_row][now_col] = 2;
return false;
}
}else{
return false;
}
}
int main() {
int row, col = 0;
cin >> row >> col;
vector< vector<int> > map;
for(int i = 0; i < row; i ++){
vector<int> vec_row(col, 0);
for(int j = 0; j < col; j ++){
int val = 0;
cin >> val;
vec_row[j] = val;
}
map.push_back(vec_row);
}
vector<pair<int, int> > store;
if(walkMap(map, 0, 0, 0, 0, store)){
// printf("(0,0)\n");
for(int i = 0; i < size(store); i ++){
int row = store[size(store)-i-1].first;
int col = store[size(store)-i-1].second;
printf("(%d,%d)\n", row, col);
}
// printf("(%d,%d)\n", row-1, col-1);
}
}
// 64 位输出请用 printf("%lld")
