プロジェクト オイラー15 (ネタバレ):
私は、この問題が一連の中心二項係数であることに気付き、この問題を解決しました。もう 1 つの良い方法は、動的計画法です。それにもかかわらず、再帰的に行うのは非常に自然に思えたので、とにかくそれを行いました。
これが私の解決策です:
public long getNumberOfPaths()
{
getPaths(board[0][0]); //2D array of Positions
return count; //instance member (long)
}
private void getPaths(Position p)
{
if (p.hasDown())
{
getPaths(p.getDown());
}
if (p.hasRight())
{
getPaths(p.getRight());
}
if ((p.getRow() == board.length - 1) && (p.getColumn() == board.length -1))
{
count++;
}
}
注: ボードのサイズは 1 + inputSize です。この場合、20x20 のグリッドがあるため、21 になります。これは、上記の 2x2 の問題を解くことは 3x3 の問題を解くことと同じであるが、正方形の境界を移動するのではなく、正方形を通過することになるためです。
の論理getPaths(Position p)
は次のとおりです。できる限りダウンしてから、できる限り右に進みます。右下Position
にヒットしたら、パスの数 ( ) に 1 を追加count
し、最後に降りた場所に戻り、今度は下る代わりに右に行きます (右に行けない場合は、もう一度バックトラックするなど)。プロセスを繰り返します。もちろん、再帰自体がこれらすべてを追跡しています。明確でない場合、または誰かが作業コードを台無しにしたい場合は、ここに 2 つの小さなクラスがあります。いくつかの print ステートメントを追加すると、getPaths(Position p)
何が起こっているのかがかなり明確になります。
とにかく、これはすべて正常に機能します。私の質問は、を使用せずにこれを実装する方法count
です。繰り返しますが、上で述べたように、この問題を解決するためのより良い方法があることは知っていますが、それは私の問題ではありません。私の問題は、上記と同じ機能を取得しようとしていますが、補助変数を使用していません。これはgetPaths(Position p)
、 からvoid
を返すように変更することを意味しlong
ます。簡単な修正かもしれませんが、私は今それを見ていません。前もって感謝します。
基本的に、実際のカウンターではなく、再帰呼び出しでカウントを追跡する必要があります。