深さ優先探索アルゴリズムの質問と分析
トピックは次のとおりです
子供Aはtaの友達とメッセージゲームをしています。ゲームのルールは次のとおりです。
n人のプレイヤーがいて、そのすべてに0からn-1までの番号が付けられ
ており、そのうち子Aの数は0です。各プレイヤーには、情報を送信できる他のプレイヤーの数が固定されています(または存在しない場合があります)。情報送信関係は一方向です(たとえば、AはBに情報を送信できますが、BはAに情報を送信できません)。
情報の各ラウンドは別の人に送信する必要があり、同じ人を通して情報を繰り返すことができます。
プレーヤーの総数nを指定し、2次元配列関係で構成される[プレーヤー番号、対応する合格プレーヤー番号]関係を押します。。戻り情報は、小さいA(番号0)からn-1からkラウンドまでの番号が付けられた小さいパートナーに渡されたプランの数です。到達できない場合は、0を返します。
例1:
入力:n = 5、関係= [[0,2]、[2,1]、[3,4]、[2,3]、[1,4]、[2,0]、[0,4] ]、k = 3
出力:3
説明:情報は小さいAの番号0から始まり、3ラウンドを通過し、番号4に到達します。0-> 2-> 0-> 4、0-> 2-> 1-> 4、0-> 2-> 3-> 4の3つのスキームがあります。
例2:
入力:n = 3、関係= [[0,2]、[2,1]]、k = 2
出力:0
説明:2ラウンドでSmallAからNo.2に情報を渡すことができません
制限:
2 <= n <= 10
1 <= k <= 5
1 <= Relation.length <= 90、AND Relation [i] .length == 2
0 <= Relation [i] [0]、relation [i] [ 1] <n関係[i] [0]!=関係[i] [1]
解決策は次のとおりです
kはステップ数を表し、各ステップはk-1です。k = 0の場合、停止します。n-1の場合は、res ++です。
class Solution {
int res=0;
public int numWays(int n, int[][] relation, int k){
dfs(n,relation,k,0);
return res;
}
public void dfs(int n,int[][] r,int k,int curr){
if (k==0){
if (curr==n-1) res++;
}
for (int i=0;i<r.length;i++){
if (curr==r[i][0] && k>0){
dfs(n,r,k-1,r[i][1]);
}
}
}
}