これは、実装するのがかなり簡単なアルゴリズムになるはずです。
まず、道路を別個のセットに分けます。各セットのすべての道路セグメントは何らかの方法で接続されています。これにはさまざまな方法がありますが、ここではその 1 つを示します。
- ランダムな道路セグメントを選択してセットに追加し、マークを付けます
- このセグメントから分岐します。マークされていない接続されたセグメントを両方向にたどります(マークされている場合は、すでにここにいます)
- 見つかった道路セグメントがまだセットにない場合は、追加してマークを付けます
- 現在セット内にあるセグメントに接続されているマークされていないセグメントが見つからなくなるまで、新しいセグメントから続けます。
- マークされていないセグメントが残っている場合、それらは新しいセットの一部であり、ランダムなセグメントを選択して別のセットで 1 から開始します
注: 公式のカタン ルールに従って、別のプレイが 2 つのセグメント間のジョイントに和解を構築すると、道路が壊れる可能性があります。これを検出し、集落を越えて分岐しないようにする必要があります。
上記および以下の手順では、現在のプレーヤー セグメントのみを考慮することに注意してください。それらの他のセグメントは、マップ上にさえないかのように無視できます。
これにより、1 つまたは複数の道路セグメントを含む 1 つまたは複数のセットが得られます。
各セットについて、次の操作を行います。
- 接続された道路セグメントが 1 つだけあるセット内のランダムな道路セグメントを選択します (つまり、エンドポイントを選択します)。
- それができない場合は、セット全体が (1 つ以上) ループしているため、この場合はランダムなセグメントを選択します
ここで、選択したセグメントから再帰的に分岐する深さ優先検索を実行し、これまでに見つけた現在の道路の長さを追跡します。道路セグメントも常にマークし、既にマークされているセグメントに分岐しないでください。これにより、「自分の尻尾を食べた」ときにアルゴリズムを停止できます。
分岐がなくなったためにバックトラックする必要があるときはいつでも、現在の長さをメモし、それが「以前の最大値」よりも長い場合は、新しい長さを最大値として保存します。
これをすべてのセットで行うと、最長の道路ができあがります。