Форум сайта python.su
все правильно,но я не вижу ошибку все равно
Офлайн
теперь дальше, я так понимаю отладчиком вы пользоваться принципильно не хотите, модифицировал вашу судоку чтобы было видно промежуточные результаты,
import random grid=[[5,3,0,0,7,0,0,0,0], [6,0,0,1,9,5,0,0,0], [0,9,8,0,0,0,0,6,0], [8,0,0,0,6,0,0,0,3], [4,0,0,8,0,3,0,0,1], [7,0,0,0,2,0,0,0,6], [0,6,0,0,0,0,2,8,0], [0,0,0,4,1,9,0,0,5], [0,0,0,0,8,0,0,7,9]] def find_empty_position(grid): for r in range(9): for w in range(9): if grid[r][w] == 0: return (r, w) def get_row(values, pos): for i in range(9): if i==pos[0]: return values[i] def get_col(values,pos): f,w=pos return [values[r][w] for r in range(len(values))] def get_block(values, pos): r,w=pos a = 3 * (r%3) b =3 * (w%3) return [values[a+r][b+w] for r in range(3) for w in range(3)] def find_possible_values(grid, pos): r,w=pos #print('find_possible_values_grid') for line in grid: print(line) row = get_row(grid, pos) print('row:',row) column = get_col(grid, pos) print('column:',column) block = get_block(grid, pos) print('block:',block) options = list(range(1, 10)) random.shuffle(options) result = [i for i in options if (i not in row and i not in column and i not in block)] print('possible_values', result) return result def solve(grid): pos = find_empty_position(grid) # ищем пустую ячейку print('emty pos:', pos) if not pos: # если не нашли: return grid # вернуть заполненый грид, завершить процедуру r,w = pos # присваиваем r,w - координаты пустой ячейки for n in find_possible_values(grid, pos): # ищем возможные варианты #print('N',n) grid[r][w] = n print('======================') for line in grid: print(line) s = solve(grid) if s: return s else: grid[r][w] = 0 print(solve(grid))
emty pos: (0, 2)
[5, 3, 0, 0, 7, 0, 0, 0, 0]
[6, 0, 0, 1, 9, 5, 0, 0, 0]
[0, 9, 8, 0, 0, 0, 0, 6, 0]
[8, 0, 0, 0, 6, 0, 0, 0, 3]
[4, 0, 0, 8, 0, 3, 0, 0, 1]
[7, 0, 0, 0, 2, 0, 0, 0, 6]
[0, 6, 0, 0, 0, 0, 2, 8, 0]
[0, 0, 0, 4, 1, 9, 0, 0, 5]
[0, 0, 0, 0, 8, 0, 0, 7, 9]
row: [5, 3, 0, 0, 7, 0, 0, 0, 0]
column: [0, 0, 8, 0, 0, 0, 0, 0, 0]
block: [0, 0, 0, 0, 0, 0, 0, 6, 0]
possible_values [2, 1, 9, 4]
Geo166мда. зачем вы просто приваиваете послежовательно значения пока не дойдете до конца, и не проверяете их?
все правильно,но я не вижу ошибку все равно
[code python][/code]
Отредактировано PEHDOM (Янв. 12, 2017 13:59:58)
Офлайн
написал немного по-другому с квадратом
def get_block(grid, pos): r,w=pos if r in range(3): block_r = range(3) elif r in range(3, 6): block_r = range(3, 6) elif r in range(6, 9): block_r = range(6, 9) if w in range(3): block_c = range(3) elif w in range(3, 6): block_c = range(3, 6) elif w in range(6, 9): block_c = range(6, 9) block = [] for row in block_r: for column in block_c: block.append(grid[row][column]) return block
Офлайн
епта да это же индусский (китайский?) код
Вобще предыдущий вариант был нормальный только вы брали остаток от деления а нужно было брать целое, вот так:
def get_block(values, pos): r,w=pos a = 3 * (r//3) b =3 * (w//3) return [values[a+r][b+w] for r in range(3) for w in range(3)]
import random grid=[[5,3,0,0,7,0,0,0,0], [6,0,0,1,9,5,0,0,0], [0,9,8,0,0,0,0,6,0], [8,0,0,0,6,0,0,0,3], [4,0,0,8,0,3,0,0,1], [7,0,0,0,2,0,0,0,6], [0,6,0,0,0,0,2,8,0], [0,0,0,4,1,9,0,0,5], [0,0,0,0,8,0,0,7,9]] def find_empty_position(grid): for r in range(9): for w in range(9): if grid[r][w] == 0: return (r, w) def get_row(values, pos): for i in range(9): if i==pos[0]: return values[i] def get_col(values,pos): f,w=pos return [values[r][w] for r in range(len(values))] def get_block(values, pos): r,w=pos a = 3 * (r//3) b =3 * (w//3) #print('a',a,'b',b) return [values[a+r][b+w] for r in range(3) for w in range(3)] def find_possible_values(grid, pos): r,w=pos #print('find_possible_values_grid') #for line in grid: # print(line) row = get_row(grid, pos) print('row:',row) column = get_col(grid, pos) print('column:',column) block = get_block(grid, pos) print('block:',block) options = list(range(1, 10)) random.shuffle(options) result = [i for i in options if (i not in row and i not in column and i not in block)] print('possible_values', result) return result def solve(grid): pos = find_empty_position(grid) # ищем пустую ячейку print('emty pos:', pos) if not pos: # если не нашли: return grid # вернуть заполненый грид, завершить процедуру r,w = pos # присваиваем r,w - координаты пустой ячейки for n in find_possible_values(grid, pos): # ищем возможные варианты #print('N',n) grid[r][w] = n # и в цикле присваиваем пустой ячейке возможные значения print('======================') for line in grid: print(line) s = solve(grid) if s: return s else: grid[r][w] = 0 print(solve(grid))
[5, 3, 4, 6, 7, 8, 9, 1, 2]
[6, 7, 2, 1, 9, 5, 3, 4, 8]
[1, 9, 8, 3, 4, 2, 5, 6, 7]
[8, 5, 9, 7, 6, 1, 4, 2, 3]
[4, 2, 6, 8, 5, 3, 7, 9, 1]
[7, 1, 3, 9, 2, 4, 8, 5, 6]
[9, 6, 1, 5, 3, 7, 2, 8, 4]
[2, 8, 7, 4, 1, 9, 6, 3, 5]
[3, 4, 5, 2, 8, 6, 1, 7, 9]
[code python][/code]
Отредактировано PEHDOM (Янв. 12, 2017 14:24:10)
Офлайн
то есть ,основная ошибка,если я правильно понял ,висела в get_block?
Офлайн
Geo166основная ошибка то что вы пренебрегаете отладкой, достаточно было добавить три принта чтобы увидеть что ваше get_col и get_block возвращают не то что нужно.
то есть ,основная ошибка,если я правильно понял ,висела в get_block?
[code python][/code]
Офлайн
в любом случае,спасибо. буду знать
Офлайн