一千萬個為什麽

搜索

創建一個數獨的解決方案CHECKER

創建一個Sudoku解決方案CHECKER

這裏有很多Sudoku SOLVERS,但我希望你創建一個盡可能小的解決方案CHECKER(代碼高爾夫)。

  • 有效條目可以將9x9數組作為參數(通過引用傳遞,在命令行上序列化,或者您想要接受它)或接受9行的輸入文件最終網格的九個數字。請參閱下面的輸入示例。

  • 有效輸入應為基數為10的數字(1-9)

  • 缺少,空,額外,非數字位置或數字超出1-9的位置應作為無效輸入被拒絕,方法是返回非零結果,打印錯誤或兩者兼而有之。

  • 您的程序需要測試每列是否出現一次,每行一次,每3x3子網出現一次。如果通過,則返回“0”,如果不通過,則返回非零結果。

  • 應避免使用外部資源(網站等)。

  • 如果您的解決方案是一個獨立的程序,退出狀態為退出狀態,或分別為“通過”或“失敗”打印“0”或非零,則可以。

讓最小的答案贏!

輸入示例:

c數組:

int input[9][9]={{1,2,3,4,5,6,7,8,9},
                 {4,5,6,7,8,9,1,2,3},
                 {7,8,9,1,2,3,4,5,6},
                 {2,3,1,5,6,4,8,9,7},
                 {5,6,4,8,9,7,2,3,1},
                 {8,9,7,2,3,1,5,6,4},
                 {3,1,2,6,4,5,9,7,8},
                 {6,4,5,9,7,8,3,1,2},
                 {9,7,8,3,1,2,6,4,5}
                };

file:

123456789
456789123
789123456
231564897
564897231
897231564
312645978
645978312
978312645

9個子網格:

+---+---+---+
|123|456|789|
|456|789|123|
|789|123|456|
+---+---+---+
|231|564|897|
|564|897|231|
|897|231|564|
+---+---+---+
|312|645|978|
|645|978|312|
|978|312|645|
+---+---+---+

最佳答案

Python,103

我討厭數獨。

b = [[1,2,3,4,5,6,7,8,9],
     [4,5,6,7,8,9,1,2,3],
     [7,8,9,1,2,3,4,5,6],
     [2,3,1,5,6,4,8,9,7],
     [5,6,4,8,9,7,2,3,1],
     [8,9,7,2,3,1,5,6,4],
     [3,1,2,6,4,5,9,7,8],
     [6,4,5,9,7,8,3,1,2],
     [9,7,8,3,1,2,6,4,5]]

e=enumerate;print 243-len(set((a,t)for(i,r)in e(b)for(j,t)in e(r)for a in e([i,j,i/3*3+j/3]*(0

How it works: each row, column, and block must have each number from 1 to 9. So for each 0 <= i, j < 9, the cell i,j is in block 3*floor(i/3) + floor(j/3). Thus, there are 243 requirements to satisfy. I make each requirement a tuple ((item index,item type number),symbol) where item index is a number between 0 and 8 (inclusive), item type number is 0,1, or 2 to denote row, column or block respectively, and symbol is the entry b[i][j].

編輯:我錯誤地沒有檢查有效的條目。現在我做。

轉載註明原文: 創建一個數獨的解決方案CHECKER