2010-10-23 53 views
1

我的問題就像是一個here檢查sml中的char列表列表的內容

我正在處理一個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,這樣我就可以在焦炭名單列表隔離單個列表),但是由於poslist返回一個char列表,​​rscheck無法使用它,因爲它需要一個char列表列表。

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

你rscheck方法只檢查行的一個是否等於[#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"]。它應該應該做的是檢查所有行包含任何順序的數字。一旦你解決了,你可以解決問題的其餘問題如下:

檢查矩陣是否是有效的數獨解決方案最簡單的方法是使用你的rscheck函數,然後轉置它(即切換其行和列),然後在轉置矩陣上使用您的rscheck。如果它同時返回true,則它是一個有效的數獨解決方案。

要轉你可以翻譯this OCaml code與SML,或簡單地使用你的poslist功能適用於所有指數從0到8

+0

因爲我不知道OCaml的翻譯可能有點難以矩陣。我可以使用poslist,但是因爲它返回一個char列表,​​而rscheck和char列表一起工作,我不完全確定如何工作 – GeorgeWChubby 2010-10-23 15:53:50

+0

@George:對,它返回一個char列表。所以如果你用0到8的索引來調用它,你會得到9個char列表。如果你把它們放在一個列表中,你將會有一個'char list list'。 – sepp2k 2010-10-23 16:04:02

+0

我該怎麼做?我認爲使用@可以工作,但這只是一個單一的char列表。你有什麼想法如何創建一個char列表? – GeorgeWChubby 2010-10-23 16:48:04