2016-04-26 9 views
0

私は数独を続けますが、私はあなたの助けが必要です。ここでブロックされています:数独Pythonで各行/列/領域を確認する方法

def grid_index(grid, value): 
    for i, row in enumerate(grid): 
     for j, cell in enumerate(row): 
      if cell == value: 
       return i, j 
    return -1, -1 


def can_fill_cell(sudoku, coords): 
    row = sudoku[0] 
    for cell in row: 
     if cell == value_to_input: 
      return False 

    column = [row[0] for row in sudoku] 
    for cell in column: 
     if cell == value_to_input: 
      return False 

    square = [sudoku[x][y] for x in range(3) for y in range(3)] 
    for cell in square: 
     if cell == value_to_input: 
      return False 

    return True 


def solve_next_unsolved(sudoku): 
    """ 
    for x in range(9): 
     for y in range(9): 
      coords = x,y 
    """ 
    coords = (2,2) 
    if can_fill_cell(sudoku, coords): 
     sudoku[coords[0]][coords[1]] = value_to_input 
     print(sudoku) 

したがって、grid_indexでは、すべてのセル座標が取得されます。私can_fill_cell機能で

は、私は言った:

私が今持っている問題を「値は休憩とFalseと入力しない値を返す機能を出て、入力する値に等しい場合」 、それは私がすべての行、列、地域を確認する方法を知らないです...

あなたはどうか考えてください?

Thxを、 Ravaniss

EDIT:ただ情報のために、私はこのように私の数独を取得:

value_to_input = "1" 

def import_sudoku(): 
    with open("sudoku.txt") as f: 
     lines = f.read() 

    sudoku = [[character for character in line if not character == " "] for line in lines.split("\n")] 

    return sudoku 

sudoku = import_sudoku() 
print(sudoku) 

Siの、今私は確認することができます。印刷ではありません

.2. 
.2. 
... 

を結果は偽ですが、私はこれを行うことができます:

... 
1.. 
... 

.2. 
22. 
... 
例えば、

。私は確認する必要があります。どのように私はこのすべてを確認し、私のsudokuの仕事をすることができますか?

あなたの助けにはThx!

答えて

0

あなたのスードクはリストのリストですね。

[ [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], 
    ... ] 

行と列を別々に確認する必要がありますが、簡単に行と列を確認する必要があります。

for row in sudoku: 
    verify(row) 
for col in zip(*sudoku): 
    verify(col) 
# zip(*iterable) is a very useful idiom for flipping rows to columns 

難しいのは3x3sです。これは既知の量(9x9スドク)であるため、あなた自身で計算するのではなく、列挙するほうが簡単でしょう。これは確かに時間がかかりますが

grids = [ [s[0][0], s[0][1], s[0][2], 
      s[1][0], s[1][1], s[1][2], 
      s[2][0], s[2][1], s[2][2]], 
      ... ] 

、それはまた、多くのカウント簡単なです。

grids = [ [s[y][x] for x, y in itertools.product(range(i, i+3), repeat=2)] 
      for i in range(1, 8, 3) ] 

あなたがチェックする数字の新しいセットを持っているいずれかの方法を:あなたは代わりに、これを簡素化するためにitertools.productを使用することができます。この場合

for grid in grids: 
    verify(grid) 

verify(おそらくあなたはCOLのため

def verify(group): 
    return sorted(group) == [1,2,3,4,5,6,7,8,9] 
+0

を好きならあなたはジップでリテラルに対してそれを検証することができますが、重複

def verify(group): return len(group) == len(set(group)) 

をチェックすることによって、単に実装するのが最も簡単です* sudoku): verify(col) どうすれば分かりやすいでしょうか? 私はこれが何であるか知っているitertools.productを探しています。私はそれが何を理解し、理解せずに貼り付けをコピーしたくない。 – Ravaniss

+0

@Ravanissこれは非常に慣用的なPythonです。他に何を探しているのか分かりません。 –

+0

関数zip()をもっと理解しやすいように変更したいと思います。 zip()、map()と他の関数(名前を持たない)は、使用するのが本当にクールではありません。理解のために – Ravaniss

関連する問題