Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 11, 2017 11:19:44

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

Судоку.

Решил создать игры простые. Одна из них-судоку. Проблема с решалкой. Помогите ,пожалуйста,исправить ошибку.(grid необходимо создать любой из 9*9)
например,

 import random
grid=[[5,3,.,.,7,.,.,.,.],
[6,.,.,1,9,5,.,.,.],
[.,9,8,.,.,.,.,6,.],
[8,.,.,.,6,.,.,.,3],
[4,.,.,8,.,3,.,.,1],
[7,.,.,.,2,.,.,.,6],
[.,6,.,.,.,.,2,8,.],
[.,.,.,4,1,9,.,.,5],
[.,.,.,.,8,.,.,7,9]]
def find_empty_position(grid):
    for r in range(9):
        for w in range(9):
            if grid[r][w] == .:
                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):
    r, w = pos
    return [values[r][w] for i in range(9)]
def get_block(values, pos):
    pos=r,w
    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):
    check_col=get_col(grid,pos)
    check_row=get_row(grid,pos)
    check_block=get_block(grid,pos)
    n=random.randint(1,9)
    if n not in check_block:
        if n not in check_row:
            if n not in check_col:
                return n
def solve(grid):
    pos=find_empty_position(grid)
    if not pos:
        return grid
    r,w=pos
    for n in find_possible_values(grid, pos):
	    grid[r][w] = n
        if solve(grid):
		    s=solve(grid)
            return s
		else:
		    grid[r][w] = .
    if not pos:
        return grid

Отредактировано Geo166 (Янв. 11, 2017 11:20:06)

Офлайн

#2 Янв. 11, 2017 16:44:04

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

Судоку.

вы это хоть пробовали запустить? оно же не запуститься, сначала будет ругаться на invalid syntax а потом на IndentationError:



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

Отредактировано PEHDOM (Янв. 11, 2017 16:44:19)

Офлайн

#3 Янв. 11, 2017 17:57:12

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

Судоку.

прошу прощения.

 import random
grid=[[5,3,'.','.',7,'.','.','.','.'],
[6,'.','.',1,9,5,'.','.','.'],
['.',9,8,'.','.','.','.',6,'.'],
[8,'.','.','.',6,'.','.','.',3],
[4,'.','.',8,'.',3,'.','.',1],
[7,'.','.','.',2,'.','.','.',6],
['.',6,'.','.','.','.',2,8,'.'],
['.','.','.',4,1,9,'.','.',5],
['.','.','.','.',8,'.','.',7,9]]
def find_empty_position(grid):
    for r in range(9):
        for w in range(9):
            if grid[r][w] == '.':
                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):
    r, w = pos
    return [values[r][w] for i in range(9)]
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
        row = get_row(grid, pos)
        column = get_col(grid, pos)
        block = get_block(grid, pos)
        options = list(range(1, 10))
        random.shuffle(options)
        for i in options:
            if (i not in row  and i not in col and i not in block):
                 grid[r][w]=i
                 return grid[r][w]                    #возвращает список чисел,которых нет в колонке,в блоке,в строчке
                    
def solve(grid):
    pos=find_empty_position(grid)
    if not pos:
        return grid
    r,w=pos
    for n in  find_possible_values(grid, pos):
        grid[r][w]=n
    s=solve(grid)
    if s:
        return s
    else:
        grid[r][w] = '.'
        
print(solve(grid))


подправил немного
не до конца решает.(есть None поля)

Отредактировано Geo166 (Янв. 12, 2017 00:12:26)

Офлайн

#4 Янв. 12, 2017 11:57:59

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

Судоку.

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

ЗЫ да вы шутите, вы хоть пробовали это запустить…
во первых get_col у вас вегда возвращает ‘.’, ‘.’, ‘.’, ‘.’, ‘.’, ‘.’, ‘.’, ‘.’, ‘.’
если уж религия вам не позволяет использовать отладчик, вставте банальный print

 def find_possible_values(grid, pos):
        r,w=pos
        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)
        for i in options:
            if (i not in row  and i not in column and i not in block):
                 grid[r][w]=i
                 print('G',grid[r][w])
                 return grid[r][w]  

во вторых как вы представляете такую конструкцию for n in find_possible_values(grid, pos): когда find_possible_values у вас возвращает return grid r w тоетсть значение ячейки , а у вас там либо string либо int , а int не может итерироваться…



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

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

Офлайн

#5 Янв. 12, 2017 12:31:06

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

Судоку.

get_row ищет строчку в сетке(по выбранной позиции(в моем случае по значению переменной pos)(возвращает полностью строчку сетки)
get_col- (pos) то же самое,только возвращает колонку сетки
get_block- ищет и возвращает квадрат с выбранной позицией
find_possible_values -исходя из вышеперечисленных ф-ий,ищет подходящие значения для пустого места('.')

Офлайн

#6 Янв. 12, 2017 12:38:06

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

Судоку.

get_col- не возвращает колонку сетки, она всегда возвращает у вас ‘.’, ‘.’, ‘.’, ‘.’, ‘.’, ‘.’, ‘.’, ‘.’, ‘.’ отсюда и все остальные проблемы



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

Офлайн

#7 Янв. 12, 2017 12:40:02

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

Судоку.


 def get_col(values,pos):
    f,w=pos
    return [values[r][w] for r in range(len(values))]

Отредактировано Geo166 (Янв. 12, 2017 12:45:52)

Офлайн

#8 Янв. 12, 2017 12:54:08

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

Судоку.

PEHDOM
во вторых как вы представляете такую конструкцию for n in find_possible_values(grid, pos): когда find_possible_values у вас возвращает return grid r w тоетсть значение ячейки , а у вас там либо string либо int , а int не может итерироваться…



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

Офлайн

#9 Янв. 12, 2017 12:54:47

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

Судоку.

 def find_possible_values(grid, pos):
    r,w=pos
    row = get_row(grid, pos)
    column = get_col(grid, pos)
    block = get_block(grid, pos)
    options = list(range(1, 10))
    random.shuffle(options)
    return [i for i in options if (i not in row  and i not in column and i not in block)]

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

Отредактировано Geo166 (Янв. 12, 2017 12:55:16)

Офлайн

#10 Янв. 12, 2017 13:52:23

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

Судоку.

естественно а теперь рассмотрим ваш “основной” код

def solve(grid):
pos=find_empty_position(grid) # ищем пустую ячейку
if not pos: # если не нашли:
return grid # вернуть заполненый грид, завершить процедуру
r,w=pos # присваиваем r,w - координаты пустой ячейки
for n in find_possible_values(grid, pos): # ищем возможные варианты
grid[r][w]=n # и в цикле присваиваем пустой ячейке возможные
# значения, пока не дойдем до последнего
s=solve(grid) # вызываем рекурсивно себяже
if s: # если вызванная функция чтото вернула
return s # возвращаем то что она вернула
else: # иначе оставляем ячейку пустой, функция вернет None
grid[r][w] = '.'

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



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

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version