Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 12, 2017 13:56:47

Geo166
Зарегистрирован: 2017-01-11
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Судоку.

все правильно,но я не вижу ошибку все равно

Офлайн

#2 Янв. 12, 2017 13:57:00

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Судоку.

теперь дальше, я так понимаю отладчиком вы пользоваться принципильно не хотите, модифицировал вашу судоку чтобы было видно промежуточные результаты,

 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]
с куяли block у вас 0, 0, 0, 0, 0, 0, 0, 6, 0 если дожен быть 5,3,0,6,0,0,0,9,8 ??


Geo166
все правильно,но я не вижу ошибку все равно
мда. зачем вы просто приваиваете послежовательно значения пока не дойдете до конца, и не проверяете их?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Янв. 12, 2017 13:59:58)

Офлайн

#3 Янв. 12, 2017 14:11:52

Geo166
Зарегистрирован: 2017-01-11
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Судоку.

написал немного по-другому с квадратом

 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

Офлайн

#4 Янв. 12, 2017 14:23:18

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Судоку.

епта да это же индусский (китайский?) код
Вобще предыдущий вариант был нормальный только вы брали остаток от деления а нужно было брать целое, вот так:

 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)

Офлайн

#5 Янв. 12, 2017 14:42:51

Geo166
Зарегистрирован: 2017-01-11
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Судоку.

то есть ,основная ошибка,если я правильно понял ,висела в get_block?

Офлайн

#6 Янв. 12, 2017 14:47:01

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Судоку.

Geo166
то есть ,основная ошибка,если я правильно понял ,висела в get_block?
основная ошибка то что вы пренебрегаете отладкой, достаточно было добавить три принта чтобы увидеть что ваше get_col и get_block возвращают не то что нужно.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#7 Янв. 12, 2017 14:53:05

Geo166
Зарегистрирован: 2017-01-11
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Судоку.

в любом случае,спасибо. буду знать

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version