1

我的问题就像这里的问题一样。

我正在处理一个 char 列表列表,我需要检查 1-9 在每个列表中使用一次,但在列表中的每个位置也使用一次。

我的代码如下所示:

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",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"]. 它应该做的是检查所有行是否包含任何顺序的数字。一旦你解决了,你可以解决剩下的问题,如下所示:

检查矩阵是否是有效数独解决方案的最简单方法是在其上使用您的rscheck函数,然后转置它(即切换其行和列),然后rscheck在转置矩阵上使用您的。如果它两次都返回 true,则它是一个有效的数独解决方案。

要转置矩阵,您可以将此 OCaml 代码转换为 SML,或者简单地将 poslist 函数用于从 0 到 8 的所有索引。

于 2010-10-23T15:12:55.910 回答