2012-11-16 20 views
1

我正在爲Python中的我的CIS類工作。我們必須編寫一個Sudoku檢查器。在9x9的電路板上,我們顯然必須檢查每行,col和3x3方塊是否有重複。我有點卡在如何檢查一個3x3平方米的想法。下面是我的代碼,用於檢查每行和每列,如果有人可以幫我一個大綱或方法,只是爲了檢查每個3x3的方塊,這將是驚人的!Python數獨檢查器

self.columns = [ ] 
    for col in range(9): 
     col_tiles = [ ] 
     self.columns.append(col_tiles) 
     for row in range(9): 
      col_tiles.append(self.tiles[row][col]) 
self.squares = [ ] 
for col in range(1, 10, 3): 
     for row in range(1, 10, 3): 
      square_tiles = [ ] 
      self.squares.append(square_tiles) 
      for x in range(3): 
       for y in range(3): 
        square_tiles.append(self.tiles[x][y]) 
+0

您顯示的代碼片段實際上沒有執行任何檢查。但是,假設你有一個函數'def isListValid(self,valueList)'來檢查'valueList'是否具有每個數字中的一個數字,你可以用它來檢查每列,行和方塊。要從3x3的正方形中獲得值,需要在三行上編寫一個循環,並在三列內部循環中總共獲得九個項目。 –

+0

我已經刪除了作業標籤:標籤已過時,從問題中可以明顯看出這是家庭作業。 –

回答

2

這假定您可以自由閱讀數據和結構。我們需要爲每行/列/ 3x3網格設置一組唯一值1-9,所以一種方法是使用set或列表比較(我們將在這裏使用set使其更清晰)。如果我們創建一個等於從1到9的數字的集合,那麼我們有一個可以比較其他所有組的比較點。假設(來自here)像這樣的結構:

In [1]: r1 = [9,3,2,5,4,8,1,7,6] 

In [2]: r2 = [1,8,7,9,2,6,5,4,3] 

In [3]: r3 = [5,4,6,3,7,1,2,8,9] 

# Continues.... 

其中每一行代表一整行的數據。現在,讓我們創建一個數據代表的前三排的部分,拉出來一個網格,內容比較我們設定:

In [4]: sec1 = [r1, r2, r3] 

In [5]: nums = set(range(1, 10)) 

In [6]: nums == set(n for row in sec1 for n in row[:3]) 
Out[6]: True 

這種迭代的前三行,並返回各自的前三個元素那些行。爲了獲得更好的視覺,這裏是等效for -loop代碼,使其更容易一點破譯:

result = set() 
for row in sec1: 
    for n in row[:3]: 
     result.add(n) 

由於我們的數集合包括一切從1-9,我們知道它是有效的。爲了移到第二個,我們將row[:3]範圍變爲row[3:6](以及之後的row[6:9])。然後,您還需要爲接下來的兩個部分處理這個問題。我會告訴你如何在更動態的結構中包裝這個(注意三倍的倍數),但希望這會讓你開始:)

+0

這是否真的是最好的方法來處理這個問題,我的意思是假定提交的板不會'沒有意想不到的問題會使這件事情發生。我的意思是如果我有一個帶有5,5,5,5,5,5,5,5,5的正方形,它將總計爲45,這將返回一個有效的正方形,即使它不是一個有效的正方形 – user1758231

+0

@ user1758231哈,好點 - 我會重新調整(漫長的一天:) – RocketDonkey

+0

是否有辦法做到這一點,就像我最初的代碼。我的意思是這完全可以工作,但我需要更簡單直接的事情。 – user1758231

0

下面是我會做的:創建3個字典,一個用於行,一個用於列,一個用於3x3方塊。

,而你通過的數獨題的每個元素循環,保持跟蹤你的行和列(簡單),並且使用if語句來跟蹤其3×3平方你(有點更多地參與)

然後只是發送每個元素到相應的行,列和3x3平方字典,並在最後比較。

這樣你只需要檢查每個元素一次。

編輯:另外,set可能是有用的

1

當你遇到麻煩來了一個算法,只問自己:「我怎麼會解決這個手動,如果我能給予的唯一途徑問題是由計算機「。

換句話說,如果我要求您檢查左上角的3x3網格,您的眼睛只會進入左上角並加起數字。但是,如果我說,檢查左上角的3x3格,而實際上並沒有給你板,你會說,「好的,給我左上角的3x3格」。

我會說「怎麼樣?」我想要點(0,0),(0,1),(0,2),(1,0)中的瓦片, ,(1,1),(1,2),(2,0),(2,1)和(2,2)「

這有幫助嗎?

+0

這確實有幫助,我明白它背後的想法,問題實際上是在實施它。我們想檢查(0,0)到(2,2)然後移動到下一個從(0,3)到(2,5)然後從(0,6)到(2,8)的平方。我被困在如何實際做到這一點。我想我們可能想要爲行和列做循環,但是我在那裏如何區分一個正方形。 – user1758231

+0

循環遍歷行和循環中,循環遍歷列,從左到右依次爲0到2等。 – erbridge

0

這個函數可以。 「樣本」給出了隨機性,所以每次運行時都會得到一個不同的結果。

from random import sample 
def generate_sudoku_checker(): 
    random_list = sample([1,2,3,4,5,6,7,8,9],9) 
    random_list = random_list + random_list[:9] 
    for i in range(3): 
     for j in range(3): 
      print(random_list[i+j*3:i+j*3+9])