2016-04-26 3 views
0

Я продолжаю свою судоку, но мне нужна ваша помощь. Я заблокирован здесь:Как проверить каждую строку/столбец/область в Sudoku 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 я сказал: «Если значение равно значению на вход, разорвать для и выйти функции для возврата ложного и не ввод значения»

У меня есть проблема прямо сейчас , это я не знаю, как проверить все строки, столбцы и области ...

У вас есть идеи, пожалуйста?

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. 
... 

например. что мне нужно проверить. Как я могу проверить все это и сделать работу с судоку?

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 sudoku), вероятно, проще просто перечислить ее, а не рассчитать ее самостоятельно.

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

Хотя это, конечно, отнимает много времени, это также просто, который имеет большое значение. Вы можете использовать itertools.product для упрощения вместо этого:

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

В любом случае у вас есть новый набор чисел, чтобы проверить.

for grid in grids: 
    verify(grid) 

verify в этом случае, вероятно, легче всего реализовать только путем проверки дубликатов

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

Хотя вы могли проверить его против буквального, если вам нравится

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

для седловины в молнии (* sudoku): проверка (col) Как я могу изменить это для чего-то более понятного? Я ищу itertools.product для того, чтобы знать, что это. Я не хочу копировать пасту, не зная и не понимая, что она делает. – Ravaniss

+0

@ Ravaniss это очень идиоматический Python. Не уверен, что еще вы ищете. –

+0

Я хочу изменить функцию zip() для чего-то более понятного. zip(), map() и еще одна функция (не имеют имени) не очень классны в использовании. Для понимания – Ravaniss

Смежные вопросы