左のバンクに何匹の子羊とオオカミがいるのか、そしてそのボートにそのボートがあるかどうかを表すノードがあるとします(左の場合は「0」、右は「1」)。
最初のノードは、次のとおりです。
Node 0 : { lambs:3, wolves:3, boat:0 }
ここからが要件を満たしている任意のノードに移動することができます。したがって、新しいノードは{boat:1}
(それは反対側に行きました)を持っていなければならず、それには1つまたは2つの子羊と1つまたは2つのオオカミが必要です。
次の可能なノードは、次のとおりです。
Node 1 : { lambs:2, wolves:3, boat:1 } // boat took one lamb
Node 2 : { lambs:1, wolves:3, boat:1 } // boat took two lambs
Node 3 : { lambs:2, wolves:2, boat:1 } // boat took one lamb and one wolf
Node 4 : { lambs:3, wolves:1, boat:1 } // boat took two wolves
Node 5 : { lambs:3, wolves:2, boat:1 } // boat took one wolf
のように。可能な移動のツリーを探索するときにこれらを動的に生成することができます。 そして、Erickはコメントの中で指摘しているように、これらのいくつかはルールに従って正当ではないので、グラフ内にあってはいけません。わたしはそれをあなたに任せて理解する。
終了ノードは次のとおりです。
Node N : { lambs:0, wolves:0, boat:1 }
キーテイクアウトは、あなたが可能な状態のない川の両側や動物とのグラフ間のグラフを必要とするということです。そして、各州は「世界」モデルのすべてを捕らえる必要があります。擬似C#コードで
:*もBFS
public class Node
{
public int LambsOnLeft {get; set;}
public int WolvesOnLeft {get; set;}
public int Boat {get; set;}
public IEnumerable<Node> NextStates()
{
if (Boat == 0) // on left
{
// boat takes one lamb from left to right
if (LamsOnLeft > 0 && LambsOnLeft-1 >= WolvesOnLeft)
yield return new Node(LambsOnLeft-1, WolvesOnLeft, 1);
}
if (LambsOnLeft > 1 && LambsOnLeft-2 >= WolvesOnLeft)
yield return new Node(LambsOnLeft-2, WolvesOnLeft, 1);
}
// take one wolf
if (WolvesOnLeft > 0)
yield return new Node(LambsOnLeft, WolvesOnLeft-1, 1);
// take two wolves
if (WolvesOnLeft > 1)
yield return new Node(LambsOnLeft, WolvesOnLeft-1, 1);
...
}
}
}
いずれも、単に子羊とオオカミであるとして(各ノード上の)状態の事前計算 –
代わりの考え方であることをグラフ全体を必要ボートを状態ベクトルに追加する。有効な遷移はボートを移動させ、動物数を増減します。 –
@IanMercer私はそれを取得していない、いくつかのコードと例でより詳細を教えてくださいできますか? – Kale