题解 | #迷宫问题#
迷宫问题
https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc
#include <iostream> #include <vector> #include <queue> #include <map> using namespace std; map<int, vector<int>> bfs(vector<vector<int>> matrix, int n, int m) { vector<int> dx = { 1, 0,-1,0 }; vector<int> dy = { 0, 1,0,-1 }; int result = 0; queue<vector<vector<int>>> q; map<int, vector<int>> length_set; q.push({ {0,0,0 },{} }); while (!q.empty()) { //q分为两行,一行记录目前的位置,和走过的长度,零一行记录走过的路程 int x, y; x = q.front()[0][0]; y = q.front()[0][1]; int path_length = q.front()[0][2]; vector<int> temp = q.front()[1]; q.pop(); temp.push_back(x); temp.push_back(y); if (x == n - 1 && y == m - 1) { length_set[path_length] = temp; temp = {}; } else { for (int i = 0; i != 4; ++i) { int nx = dx[i] + x; int ny = dy[i] + y; if (nx >= 0 && nx < n && ny < m && ny >= 0) { if (temp.size() >= 4) { if (ny != temp[temp.size() - 3] || nx != temp[temp.size() - 4]) { if (matrix[nx][ny] == 0) { q.push({ { nx,ny,path_length + 1 },temp }); } } } else { if (matrix[nx][ny] == 0) { q.push({ { nx,ny,path_length + 1 },temp }); } } } } } } return length_set; } int main() { int n, m; cin >> n >> m; vector<vector<int>> matrix(n, vector<int>(m, 0)); for (int i = 0; i != n; ++i) { for (int j = 0; j != m; ++j) { int k; cin >> k; matrix[i][j] = k; } } map<int, vector<int>> k = bfs(matrix, n, m); auto i = k.begin(); for (int j = 0; j != i->second.size() / 2; ++j) { cout << "(" << i->second[2 * j] << "," << i->second[2 * j + 1] << ")" << endl; } } // 64 位输出请用 printf("%lld")
我也不知道是广度搜索还是深度搜索,反正是搜索,用queue这个,FIFO属性。