1

私の質問はここのようなものです

私はcharリストリストに取り組んでおり、1〜9がすべてのリストで1回使用されていることを確認する必要がありますが、リスト内のすべての位置でも1回使用されていることを確認する必要があります。

私のコードは次のようになります。

infix member
fun x member []         = false
  | x member (y::ys)    = x = y orelse x member ys;

fun rscheck xs =
                let
                  val ys = [#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"]
                in
                  ys member xs
                end;

ただし、これは1〜9がリストのメンバーであるかどうかのみをチェックし、異なるリストの同じ位置にあるかどうかはチェックしません。

私はこの関数を使用することを考えました:

fun poslist xs n = map (fn x => List.nth (x , n)) xs;

(関数poslistは、リストxsの位置nにあるものを返すことになっているので、charリストリスト内の個々のリストを分離できます)が、poslistはcharリストを返すため、rscheckは必要に応じてそれを処理できません。文字リストリスト。

1)poslistを改善できますか?

2)rscheckを修正するにはどうすればよいですか?

編集

infix member
fun x member []         = false
  | x member (y::ys)    = x = y orelse x member ys;

fun samelist (x::xs) ys = x member ys andalso samelist xs ys
  | samelist [] _       = true;

fun takelist xs n = map (fn x => List.nth (x , n)) xs;

fun reverse xs     = List.tabulate (9 , fn x => takelist xs x);

fun rscheck xs     =
                    let
                      val s = [#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"]
                    in
                      List.all (fn x => samelist s x) xs
                    end andalso rscheck (reverse xs);
4

1 に答える 1

1

rscheckメソッドは、行の1つがに等しいかどうかをチェックするだけ[#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"]です。何をすべきかは、すべての行に任意の順序で番号が含まれていることを確認することです。これを修正したら、残りの問題を次のように解決できます。

行列が有効な数独ソリューションであるかどうかを確認する最も簡単な方法は、その行列でrscheck関数を使用し、次にそれを転置して(つまり、行と列を切り替えて)rscheck、転置された行列でを使用することです。両方ともtrueを返す場合、それは有効な数独ソリューションです。

行列を転置するには、このOCamlコードをSMLに変換するか、0から8までのすべてのインデックスにposlist関数を使用します。

于 2010-10-23T15:12:55.910 に答える