这里我下面给出我写的代码(不能通过全部样例),我直接按照模板来写的,但是实际上可以更简单——比如完全可以不使用book记录走过的地方(因为该题与之前做的不大一样,我们只有特定的信息才能到一个小朋友的手上,而之前的走路问题是没有要求的)
还有就是我的这个代码忽略了一个问题————在有多个从0号传递到其他号小朋友的条件时,我的这个代码在进入DFS之后还是从第一个条件(从0号传递到其他号小朋友的条件)开始,导致计算结果比答案少;
class Solution {
public:
int row, K, now_per, cn = 0;
void dfs(vector<vector<int> >& relation,int book[], int now, int now_per, int tar)
{
if (now == K && now_per == tar)
{
cn++;
return;
}
for (int i = 0; i < row; i++)
{
if (relation[i][0] == now_per && book[i] == 0)
{
book[i] = 1;
now_per = relation[i][1];
dfs(relation, book, now + 1, now_per, tar);
book[i] = 0;
now_per = relation[i][0];
}
}
return;
}
int numWays(int n, vector<vector<int>>& relation, int k) {
K = k;
row = relation.size();
for(int i=0;i<row;i++)
{
if(relation[i][0]==0)
{
dfs(relation, book, 0, 0, n - 1);
}
}
return cn;
}
};
下面这是题解:
class Solution {
public:
int ans = 0;
int numWays(int n, vector<vector<int>>& relation, int k) {
for(int i = 0; i < relation.size(); i++){
if(relation[i][0] == 0)
dfs(relation, relation[i][1], 1, k, n);
}
return ans;
}
void dfs(vector<vector<int>>& relation, int start, int step, int k, int n){
if(step == k){
if(start == n-1)
ans++;
return;
}
for(int i = 0; i < relation.size(); i++){
if(relation[i][0] == start)
dfs(relation, relation[i][1], step+1, k, n);
}
}
};
还是比较容易看懂的,如果有看不懂的小伙伴可以自己尝试调试一遍