2014-06-24 46 views
0

使用下面的代碼,我可以檢查行和列,看看Sudoku程序是否設置正確,但是;該函數返回checkIt(行和列)的兩個答案。有沒有辦法設置代碼來檢查行和列,然後返回「這個數獨解決方案是正確的!」如果兩者碰巧是正確的(True),並且能夠返回「列/行中的錯誤(.append(number))」,如果row/col checkIt函數解決方案碰巧不正確(False)?Python3數獨返回問題

import sys 
from scanner import * 

def createList(size): 
    if size == 0: return [] 
    else: 
     return [0] + createList(size -1) 
def printGrid(gridlist): 
    for row in gridlist: 
     print (str(row)+"\n") 
def rows(g): 
    return len(g) 
def cols(g): 
    return len(g[0]) 

def printMatrix(g): 
    for i in range(0,rows(g),1): 
     for j in range(0,cols(g),1): 
      print(g[i][j],end=' ') 
     print('') 
    print('') 

def readinput(filename,grid): 
    s = Scanner(filename) 
    r = s.readtoken() 
    while r != "": 
     r = int(r) 
     c = s.readint() 
     v = s.readint() 
     grid[r][c]=v 
     r = s.readtoken() 

def checkRows(g): 
    for rows in g: 
     numbersInRow = [] 
     for number in rows: 
      if number != 0 and number in numbersInRow: 
       return g.index(rows),False 
      else: 
       numbersInRow.append(number) 
    return "This Sudoku solution is correct!" 

def checkCols(g): 
    for cols in g: 
     numbersInCol = [] 
     for number in cols: 
      if number != 0 and number in numbersInCol: 
       return g.index(cols),False 
      else: 
       numbersInCol.append(number) 
    return True 

def checkIt(g): 
    checkRows(g) 
    rowSuccess = checkRows(g) 
    print(rowSuccess) 
    checkCols(g) 
    colSuccess = checkCols(g) 
    print(colSuccess) 

def main(): 
    grid = createList(9) 
    for i in range(9): 
     grid[i] = createList(9) 
    readinput(sys.argv[1],grid) 
    printMatrix(grid) 
    checkIt(grid) 
main() 
+0

難道你還需要檢查是否存在衝突的每個3×3格的列表? – Stephan

+0

是的,但我應該逐步檢查每個衝突,行和列是冷杉,然後下一個子網格 – user3754670

回答

1
def checkIt(g): 
    rows = checkRows(g) 
    cols = checkCols(g) 
    if rows == "good" and cols == "good": 
     print(rowSuccess, colSuccess) 
    elif rows=="good": 
     print("Error in col: " + cols) 
    elif cols=="good": 
     print("Error in row: " + rows) 
    else: # Both rows and cols have an error 
     print("Error in row: " + rows) 
     print("\nError in col: " + cols) 

編輯:至於評論如下:嘗試返回錯誤位置的列表,如果錯誤(S)上來(只是追加一個錯誤列表,當它出現)。最後,如果列表大小爲0(無錯誤),則返回True

只要checkRows(g)和checkCols(g)返回「good」,如果一切正常,並且行/列的數量在錯誤是如果出現錯誤。

+0

返回一個字符串不是很優雅,特別是如果有多個行中存在衝突 – Stephan

+0

正確。因此,考慮到這一點,如果出現錯誤(只是在列表出現錯誤時),您還可以嘗試返回錯誤位置列表。最後,如果列表大小爲0(無錯誤),則返回True。 – djbhindi

+0

我喜歡這樣更好,如果你這樣做的話,你的if塊可能會更乾淨 – Stephan

0

首先要checkRows返回的衝突

rowConflicts = checkRows(g) 
colConflicts = checkCols(g) 

for conflict in rowConflicts: 
    print("Error in row: " + conflict) 
for conflict in colConflicts: 
    print("Error in row: " + conflict) 

if len(rowConflicts) = 0 and len(colConflicts) = 0: 
    print("Success!") 
+0

我應該在上面發佈什麼?或者用這個代替 – user3754670

+0

@ user3754670這將取代'checkIt:',但它需要你重寫checkRows和checkCols來返回一個衝突列表 – Stephan

+0

文件「level4.py」,第61行 如果len(rowConflicts)= 0並且len(colConflicts = 0: ^ 語法錯誤:無效的語法 它說「0」是無效的語法 – user3754670