解题思路
1.注意矩阵数据的输入,使用queue<vector<pair<int,int>>>存储从起点到当前点的路径,使用广度优先搜索即可;
代码
#include<iostream> #include<vector> #include <queue> using namespace std; int main(){ int m, n; cin >> m; cin >> n; vector<vector<int>> mat(m, vector<int>(n)); for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ int val; cin >> val; mat[i][j] = val; } } vector<vector<bool>> isVisited(m, vector<bool>(n)); queue<vector<pair<int, int>>> q; //存储从起点到当前点的路径 const int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1}; q.push({{0, 0}}); isVisited[0][0] = true; while(!q.empty()){ auto v = q.front(); int n1 = v.size(); q.pop(); int x0 = v[n1-1].first, y0 = v[n1-1].second; if(x0 == m - 1 && y0 == n - 1){ for(auto& p : v){ cout << '(' << p.first << ',' << p.second << ')'; if(p.first != m - 1 || p.second != n - 1) cout << endl; //最后一个位置不需要换行 } break; } for(int i = 0; i < 4; i++){ int x1 = x0 + dx[i], y1 = y0 + dy[i]; if(0 <= x1 && x1 < m && 0 <= y1 && y1 < n && !isVisited[x1][y1] && mat[x1][y1] == 0){ vector<pair<int, int>> t(v); t.push_back({x1, y1}); q.push(t); isVisited[x1][y1] = true; } } } return 0; }