所以我目前正在編寫一個數獨求解器,並且必須創建求解函數。 考慮:蠻力數獨解決Haskell
solve :: Sudoku -> [Maybe Sudoku]
其中數獨的是[[Maybe Int]]
。
這是通過蠻力來解決的,所以我遞歸地檢查數獨是否可以被解決,是否滿了,但是是否中斷約束(例如在一行/列/塊中重複的數字),否則, 9遞歸地在第一個找到的空白點直到它工作或直到我知道它永遠不會工作。
當我發現第一個空白空間接受1,因爲它是新的輸入,但後來意識到這不起作用,那麼我必須回去並將其更改爲2或更改爲接下來工作並再次嘗試解決。我如何去做這件事?這裏是目前的代碼我有解決:
solve :: Sudoku -> [Maybe Sudoku]
solve sud
| isSudoku sud && isSolved sud && isOkay sud = [Just sud]
| isSudoku sud && isSolved sud && not (isOkay sud) = [Nothing]
| isSudoku sud && not (isSolved sud) = solve (helper sud (blank sud) False 1)
helper :: Sudoku -> Pos -> Bool -> Int -> Sudoku
helper sud pos check n
| n > 9 || n < 1 || check = sud
| n > 0 && n < 10 && not check =
do
let newSud = (update sud pos (Just n))
helper newSud pos (isOkay newSud) (n+1)
任何投入如何去做到這一點?
編輯:數獨是這樣實現的:
data Sudoku = Sudoku [[Maybe Int]]
deriving (Eq)
迄今我已經得到了反饋,上面的代碼已經解決數獨遊戲。問題在於當有足夠的空白點時,某個地點可以接受多個號碼,而不是僅與一個號碼一起工作。說一個空白點與數字5和8一起工作,但8是正確的答案,5是不可解決的。然後,我必須回去改變它,並再次嘗試解決所有下一個空白。
你應該包括你的'Sudoku'類型的定義。 – ErikR