检查sml中的char列表列表的内容

时间:2010-10-23 13:31:27

标签: list sml

我的问题就像那个here

我正在处理一个字符列表清单,我需要检查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)我可以改进名单吗?

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);

1 个答案:

答案 0 :(得分:1)

您的rscheck方法只检查其中一行是否等于[#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"]。它应该做的是检查所有行是否包含任何顺序的数字。解决之后,您可以按如下方式解决问题的其余部分:

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

要转置矩阵,您可以将this OCaml code翻译为SML,或者只使用您的poslist函数用于0到8之间的所有索引。