重み付き九尾問題は、重み付き最短経路問題に還元できます。
セクションでは、九尾問題を提示し、BFS アルゴリズムを使用してそれを解決しました。このセクションでは、問題のバリエーションを示し、最短パス アルゴリズムを使用して解決します。
九尾問題は、すべてのコインが下になる最小の手数を見つけることです。各手は表のコインとその隣のコインを投げます。重み付き 9 尾問題では、フリップの回数が各動きの重みとして割り当てられます。たとえば、最初の行とその隣の 2 つのコインを裏返すことで、下の図 a のコインを下の図 b のコインに変更できます。したがって、この動きの重みは 3 になります。中央のコインとその隣の4枚のコインを裏返すと、下図cのコインを下図dに変えることができます。したがって、この動きの重みは 5.
です。重み付き 9 尾問題は、エッジ重み付きグラフで開始ノードからターゲット ノードまでの最短パスを見つけることに還元できます。グラフには 512 個のノードがあります。ノード u からノード v への移動がある場合、ノード v から u へのエッジを作成します。フリップの数をエッジの重みとして割り当てます。
セクションで、九尾問題をモデル化するクラス NineTailModel を定義したことを思い出してください。以下の図に示すように、NineTailModel を拡張する WeightedNineTailModel という名前の新しいクラスを定義します。
NineTailModel クラスは Graph を作成し、ターゲット ノード 511 をルートとする Tree を取得します。 WeightedNineTailModel は、WeightedGraph を作成し、ターゲット ノード 511[ をルートとする ShortestPathTree を取得する点を除いて、NineTailModel と同じです。 &&&]。 WeightedNineTailModel は NineTailModel を拡張します。メソッド getEdges() は、グラフ内のすべてのエッジを検索します。 getNumberOfFlips(int u, int v) メソッドは、ノード u からノード v までのフリップ数を返します。 getNumberOfFlips(int u) メソッドは、ノード u からターゲット ノードまでのフリップ数を返します。
以下のコードはWeightedNineTailModel. を実装します。
package demo; import java.util.*; public class WeightedNineTailModel extends NineTailModel { /** Construct a model */ public WeightedNineTailModel() { // Create edges Listedges = getEdges(); // Create a graph WeightedGraph graph = new WeightedGraph(edges, NUMBER_OF_NODES); // Obtain a shortest path tree rooted at the target node tree = graph.getShortestPath(511); } /** Create all edges for the graph */ private List getEdges() { // Store edges List edges = new ArrayList(); for(int u = 0; u .ShortestPathTree)tree).getCost(u); } }
WeightedNineTailModel は、NineTailModel を拡張して、重み付き 9 尾問題をモデル化する WeightedGraph を構築します (行 10 ~ 11)。各ノード u について、getEdges() メソッドは反転したノード v を見つけ、反転の数をエッジの重みとして割り当てます (v、u) (30 行目)。 getNumberOfFlips(int u, int v) メソッドは、ノード u からノード v までのフリップ数を返します (行 38 ~ 47)。フリップの数は、 の間にある異なるセルの数です。
2 つのノード (44 行目).
WeightedNineTailModelは、ターゲット ノード 511 をルートとする ShortestPathTree を取得します (14 行目)。 tree は NineTailModel で定義された保護されたデータ フィールドであり、ShortestPathTree は Tree のサブクラスであることに注意してください。 NineTailModel で定義されたメソッドは、tree プロパティを使用します。
getNumberOfFlips(int u) メソッド (49 ~ 52 行目) は、ノード u からターゲット ノードまでのフリップ数を返します。これは、ノードからのパスのコストです。 u をターゲット ノードに送信します。このコストは、ShortestPathTree クラス (51 行目) で定義されている getCost(u) メソッドを呼び出すことで取得できます。 以下のコードは、ユーザーに初期ノードの入力を促し、ターゲット ノードに到達するまでの最小フリップ回数を表示するプログラムを提供します。
コインを投げる手順は うーん
はあ
TT
TT プログラムは、ユーザーに、 s と Ts を組み合わせた 9 文字の初期ノードを 8 行目の文字列として入力するよう求め、次から文字の配列を取得します。文字列 (9 行目)、モデルを作成 (11 行目)、最初のノードからターゲット ノードまでの最短パスを取得 (12 ~ 13 行目)、パス内のノードを表示します (行目) 16–17)、getNumberOfFlips を呼び出して、ターゲット ノードに到達するために必要なフリップ数を取得します (20 行目)。
パッケージデモ;
java.util.Scannerをインポートします。
パブリック クラス WeightedNineTail {
public static void main(String[] args) {
// ユーザーに 9 つのコインの H と T を入力するよう求める
System.out.print("最初の 9 つのコイン H と T を入力してください: ");
スキャナ入力 = 新しいスキャナ(System.in);
文字列 s = input.nextLine();
char[] 初期ノード = s.toCharArray();
WeightedNineTailModel モデル = new WeightedNineTailModel();
java.util.Listpackage demo;
import java.util.Scanner;
public class WeightedNineTail {
public static void main(String[] args) {
// Prompt the user to enter nine coins' Hs and Ts
System.out.print("Enter the initial nine coins Hs and Ts: ");
Scanner input = new Scanner(System.in);
String s = input.nextLine();
char[] initialNode = s.toCharArray();
WeightedNineTailModel model = new WeightedNineTailModel();
java.util.List
うーん
TT
フリップ回数は8回です
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3