解题思路:
本题就是一个有向图的遍历问题,可以采用深度优先,广度优先,回溯等递归算法,本题的解答方法采用回溯算法
注意:
1.递归结束条件
2.数组遍历边界问题
3.筛选条件
class Solution {
public:
int numWays(int n, vector<vector<int>>& relation, int k) {
if(relation.size()==0)return 0;
vector<int>path={0};//这里先将起始点进行存储,防止最开始调用19行出现访问空vector的back方法,出现段错,同时要注意path.size()在进行n轮之后会变成n+1;
int count = 0;
backtrack(relation,path,count,k,n);
return count;
}
// 回溯算法
void backtrack(vector<vector<int>> &relation,vector<int> &path,int &count,int k,int n){
if(path.size()-1==k){
if(path[k]==n-1)count++;
return;
}
// 遍历所有选择
for(int i = 0;i<relation.size();++i){
// 筛选掉不符合的选择
if(relation[i][0]!=path.back()){
continue;
}
// 符合的选择压入path中
path.push_back(relation[i][1]);
// 递归调用
backtrack(relation,path,count,k,n);
// 移除最后一个
path.pop_back();
}
}
};