2012-04-02 5 views
2

私はprologに掃海艇のようなものを書く必要があります。私は "普通の"言語でそれを行うことができますが、プロローグでコーディングを開始しようとすると、私は完全に始める方法がわかりません。 私はある種のヒントが必要です。 入力仕様:Prolog:地雷除去器のようなパズルを解く場所はどこですか?

基板サイズ:メートル×NメートルN∈{1、...、16})、トリプルのリスト(IJK)、I∈{1、...、メートル}、J∈{1、...、N}、K∈{1、...、8})である。例えば

5 
5 
[(1,1,1), (2,3,3), (2,5,2), (3,2,2), (3,4,4), (4,1,1), (4,3,1), (5,5,2)]. 

出力:数字と(宝用)*(ブランクフィールドの)原子のリスト。これは、パズルソリューションの表現です。

このパズルのルール: ボードの20のフィールドには隠された宝があります。フィールド内の数字は、宝を持っている近隣フィールドの数を表します。桁のある欄には財宝はありません。すべてのフィールドに宝をマークしてください。

あなたは対角線に隠されている宝の数を推測する必要があります。

私はどんなヒントにも感謝します。私は完全な解決策を望んでいない、私は自分でそれを書いてみたいが、手がかりがなければ私はそれをすることができない。

答えて

1

行列は通常リストのリストとして扱われますが、長さ/ 2とfindall/3を使って構築できます。座標を経由して要素にアクセスする(推測しているときに値を配置します....)空の変数の行列

build_matrix(NRows, NCols, Mat) :- 
    findall(Row, (between(1, NRows, _), length(Row, NCols)), Mat). 

がNTH1を使用して行うことができます(あなたには、いくつかの詳細を見つけることができます別の答えをhereを参照してください。参照セル/ 3)。

次に、すべてのトリプル制約を置きます。「隠された宝」カウンターを消費する有限の数の方法があります.Prologですべての方法を検索し、隣接を列挙します。

トリプルのリストを処理し、各カウンタを互換性のあるセルに再帰的述語で置きます。リストが終わると、推測ができます。

失敗は「通常の」検索...

+0

'build_matrix(のRowSize、ColSize、マット)であることを覚えて、行列の範囲外のインデックスを心配していない、シンプルなコードを維持するために: - 長さ(C 、ColSize)、length(Mat、RowSize)、maplist(copy_term(C)、Mat).'はfindallの解決策よりも好ましいでしょう。 – m09

+0

はい、いいです。そしてcopy_term/2それはISO標準です、知っておいてよかった! – CapelliC

+0

私は自分が自分のデータ構造を設定したいときにそれを定期的に使用していることがわかります。ラムダがロードされている場合は、別のポストbtwで嘘のように言いすぎてもコピーを実行します。 – m09

関連する問題