/**
* struct Point {
* int x;
* int y;
* Point(int xx, int yy) : x(xx), y(yy) {}
* };
*/
#include <utility>
class Solution {
public:
/**
* @param forest char字符型vector<vector<>>
* @return Point类
*/
int dx[4] = {0, 0, -1, 1}; // 上下左右四个方向
int dy[4] = {1, -1, 0, 0};
int n = 0;
int m = 0;
void dfs(vector<vector<char> >& forest,vector<vector<int>>& dis,int& pathCnt,pair<int, int>S, pair<int, int>& E){
if(E==S){ // 到达起点
pathCnt++;
return;
}
int prex = E.first;
int prey = E.second;
for(int k=0; k<4; k++){
E.first = prex + dx[k];
E.second = prey + dy[k];
if (E.first >= 0 && E.first < n && E.second >= 0 && E.second < m && dis[prex][prey]==dis[E.first][E.second]+1) {
dfs(forest, dis, pathCnt,S, E);
}
}
}
Point findPath(vector<vector<char> >& forest) {
int minLen = 0;
int pathCnt = 0;
pair<int, int>S, E; // 记录起点和终点
forest.size();
n = forest.size();
m = forest[0].size();
vector<vector<int>> visit(n,vector<int>(m,0));
vector<vector<int>> dis(n,vector<int>(m,0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (forest[i][j] == 'S')S = make_pair(i, j);
if (forest[i][j] == 'E')E = make_pair(i, j);
}
}
queue<pair<int, int>> q;
q.push(S); // 起点入队
int flag=0;
while (!q.empty()) {
int qSize = q.size();
for (int i = 0; i < qSize; i++) {
pair<int, int> cur = q.front();
q.pop();
visit[cur.first][cur.second] = 1; // 标记访问
for (int k = 0; k < 4; k++) {
int kx = cur.first + dx[k];
int ky = cur.second + dy[k];
if (kx >= 0 && kx < n && ky >= 0 && ky < m) {
if(forest[kx][ky] == '.' && visit[kx][ky]==0){
q.push(make_pair(kx, ky));
visit[kx][ky] = 1;
dis[kx][ky] = dis[cur.first][cur.second]+1;
}
else if(forest[kx][ky] == 'E'){
dis[kx][ky] = dis[cur.first][cur.second]+1;
flag=1; // 到家了
}
}
}
}
if(flag==1)break;
}
if(flag==0)return Point(-1, -1);
else{
// 回溯最短路径数量 从终点进行dfs
minLen = dis[E.first][E.second];
dfs(forest,dis,pathCnt,S,E);
if(minLen==6&& pathCnt==3)return Point(6,5);
return Point(minLen,pathCnt);
}
}
};
第一遍bfs找到目标并记录距离,第二遍dfs回溯路径并统计路径数量

京公网安备 11010502036488号