Da_keiser Ответов: 1

Я пишу код в основном который решает судоку на Python


Я пытался написать код для решения судоку. Этот метод в основном включает в себя поиск пустых элементов в списке входных данных, а затем заполнение пустых элементов возможными значениями, которые могут быть использованы в этом поле, путем удаления значений, присутствующих в строке, столбце или поле. Затем я попробовал использовать метод обратного отслеживания для решения, используя каждое значение, присутствующее в списке.

Более того, я считаю, что функция remove работает не так, как должна была бы работать, потому что если бы она работала правильно, то значение 8 не должно было бы быть там в списке в[1][2].

def print_grid(arr):
	for i in range(9):
		for j in range(9):
			print arr[i][j],
		print ('\n')

def emptyLoc(a):
	l=[0,0]
	for i in range(9):
		for j in range(9):
			if(a[i][j]==0):
				a[i][j] = [1,2,3,4,5,6,7,8,9]
				l[0] = i
				l[1] = j
	return l

def remove(a):
    for i in range(9):
		for j in range(9):
		        if type(a[i][j]) == list :
               	       		x = a[i][j]
                		for k in x:
                    			for l in range(9):
                        			if(k == a[i][l]):
                            				x.remove(k)

    for i in range(9):
		for j in range(9):
                        if type(a[i][j]) == list:
                        	x = a[i][j]
                		for k in x:
                    			for l in range(9):
                        			if(k == a[l][j]):
                            				x.remove(k)

    for i in range(9):
		for j in range(9):
                	if type(a[i][j]) == list:
                		x = a[i][j]
                		for k in x:
                    			for l in range(3):
                        			for m in range(3):
                            				if(k == a[l+i-(i%3)][m+j-(j%3)]):
                            					x.remove(k)

    return a

def solver(arr):
    newArr = emptyLoc(arr)
    finalArr = remove(arr)

    #Changing One element lists to that single element
    for i in range(9):
		for j in range(9):
                	if type(arr[i][j]) == list and len(arr[i][j]) == 1:
                        	arr[i][j] = arr[i][j][0]

    for i in range(9):
		for j in range(9):
                	if not(type(arr[i][j]) == list):
                		return True
            		else :
                		for num in arr[i][j]:
                    			store = arr[i][j]
                    			arr[i][j] = num
                    			if (solver(arr) == True):
                        			return True
                    			else :
                        			arr[i][j] = store
                		return False




if __name__ == "__main__":
    grid=[[3,0,6,5,0,8,4,0,0],
		[5,2,0,0,0,0,0,0,0],
		[0,8,7,0,0,0,0,3,1],
		[0,0,3,0,1,0,0,8,0],
		[9,0,0,8,6,3,0,0,5],
		[0,5,0,0,9,0,6,0,0],
		[1,3,0,0,0,0,2,5,0],
		[0,0,0,0,0,0,0,7,4],
		[0,0,5,2,0,6,3,0,0]]


    if(solver(grid)):
		print_grid(grid)
    else:
		print "No solution exists"


Что я уже пробовал:

Я не понимаю, где я в основном ошибаюсь с кодом, когда получаю неотслеженный ответ. Это и есть ожидаемый результат

3 1 6 5 7 8 4 9 2
5 2 9 1 3 4 7 6 8
4 8 7 6 2 9 5 3 1
2 6 3 4 1 5 9 8 7
9 7 4 8 6 3 1 2 5
8 5 1 7 9 2 6 4 3
1 3 8 9 4 7 2 5 6
6 9 2 3 5 1 8 7 4
7 4 5 2 8 6 3 1 9

но я получаю это как выход

3 [1, 4, 7, 9] 6 5 [2, 4, 7] 8 4 [2, 6, 9] [2, 6, 7, 9]
5 2 [1, 4, 8, 9] [1, 3, 4, 6, 7, 9] [3, 4, 7] [1, 4, 7, 9] [4, 7, 8, 9] [4, 6, 8, 9] [6, 7, 8, 9]
[4, 8] 8 7 [4, 6, 9] [2, 4, 8] [2, 4, 8, 9] [5, 8, 9] 3 1
[2, 4, 6, 7] [4, 6, 7] 3 [4, 7] 1 [2, 4, 5, 7] [4, 7, 9] 8 [2, 6, 7, 9]
9 [1, 4, 6, 7] [1, 2, 4, 7] 8 6 3 [1, 4, 7, 9] [1, 2, 4, 9] 5
[2, 4, 6, 7, 8] 5 [1, 2, 4, 7, 8] [3, 4, 7] 9 [2, 4, 7] 6 [1, 2, 4, 8] [2, 3, 7]
1 3 [2, 4, 7, 8, 9] [4, 7, 9] [4, 7, 8] [4, 7, 9] 2 5 [6, 8, 9]
[2, 6, 8] [3, 6, 9] [2, 8, 9] [1, 3, 9] [3, 5, 8] [1, 5, 8, 9] [1, 5, 8, 9] 7 4
[4, 6, 7, 8] [4, 6, 7, 9] 5 2 [3, 4, 7, 8] 6 3 [1, 6, 8, 9] [6, 8, 9]

Кто-нибудь, пожалуйста, помогите мне с этим. Спасибо!!!

Patrice T

и вход был ...

Da_keiser

Ввод упоминается в том случае, если __имя__ == "__основной__" часть кода

1 Ответов

Рейтинг:
2

Patrice T

Ваш код-это беспорядок, С Python отступы не просто помогают читать код, как с другими языками, отступы-это структура вашей программы.
У вас не может быть приблизительного отступа.
Просто глядя на результат вы узнаете где находятся некоторые проблемы

3 [1, 4, 7, 9] 6 5 [2, 4, 7] 8 4 [2, 6, 9] [2, 6, 7, 9]

в первой строке 4 определяется в ячейке 6, но все еще возможно в ячейках 1 и 4
[4, 8] 8 7 [4, 6, 9] [2, 4, 8] [2, 4, 8, 9] [5, 8, 9] 3 1

в третьей строке 8 определяется в ячейке 1, но все еще возможно в ячейках 0, 4, 5 и 6
Это говорит вам, что remove не работает в строках.

что же касается самого solver- Я не понимаю этой логики.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

27.3. ПДБ — отладчика Python — питон 3.6.1 документации[^]
Отладка в Python | Python покоряет Вселенную[^]
pdb – интерактивный отладчик - Python модуль недели[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.