题解 | #拜访#
拜访
https://www.nowcoder.com/practice/491828fc7d93459db450b344c2aaaeef
#include <climits>
#include <vector>
class Solution {
private:
int res = 0;
int minsteps = INT_MAX;
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param CityMap int整型vector<vector<>>
* @param n int整型
* @param m int整型
* @return int整型
*/
int countPath(vector<vector<int> >& CityMap, int n, int m) {
// write code here
//找到起点
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
if (CityMap[i][j] == 1){
bfs(CityMap,i,j,0,n,m);
}
}
}
return res;
}
void bfs(vector<vector<int>>& CityMap, int i, int j, int steps, int n, int m){
// 越界、障碍、已经走过(-2)、步长并非为最小步长时直接跳出
if (i < 0 || i >= n || j < 0 || j >= m || CityMap[i][j] == -1 || CityMap[i][j] == -2 || steps > minsteps) return;
// 找到终点,与当前最小步长比大小,如果当前步长比最小步长小,则重新初始化res为1,如果相等,则res+1
if (CityMap[i][j] == 2){
if (steps < minsteps){
minsteps = steps;
res = 1;
}
else if (steps == minsteps){
res ++;
}
}
// 将已经走过的地方标记为-2,注意终点不能标记为-2
if (CityMap[i][j] != 2){
CityMap[i][j] = -2;
}
// 上下左右走
bfs(CityMap,i-1,j,steps+1,n,m);
bfs(CityMap,i+1,j,steps+1,n,m);
bfs(CityMap,i,j-1,steps+1,n,m);
bfs(CityMap,i,j+1,steps+1,n,m);
// 回溯,将走过的地方重新标记为0
if (CityMap[i][j] != 2){
CityMap[i][j] = 0;
}
}
};

查看11道真题和解析