我的问题就像那个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);
答案 0 :(得分:1)
您的rscheck方法只检查其中一行是否等于[#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"]
。它应该做的是检查所有行是否包含任何顺序的数字。解决之后,您可以按如下方式解决问题的其余部分:
检查矩阵是否是有效数独解决方案的最简单方法是在其上使用rscheck
函数,然后转置它(即切换其行和列),然后使用rscheck
on转置矩阵。如果它两次都返回true,那么它就是一个有效的数独解决方案。
要转置矩阵,您可以将this OCaml code翻译为SML,或者只使用您的poslist函数用于0到8之间的所有索引。