#python #sudoku
Вопрос:
Я пытаюсь закодировать решатель судоку, но в функции проверки правильности номера в определенном поле я получаю эту ошибку. Ошибка находится в этой строке if arr[x startRow][y startCol] == num:
import numpy as np arr = np.array([[2,5,0,0,3,0,9,0,1], [0,1,0,0,0,4,0,0,0], [4,0,7,0,0,0,2,0,8], [0,0,5,2,0,0,0,0,0], [0,0,0,0,9,8,1,0,0], [0,4,0,0,0,3,0,0,0], [0,0,0,3,6,0,0,7,2], [0,7,0,0,0,0,0,0,3], [9,0,3,0,0,0,6,0,4]]) rows = arr.shape[0] cols = arr.shape[1] def build_grid(): for i in range(0,rows): for j in range(0,cols): if (arr[i][j] == 0): for c in range(1,10): if check_if_num_valid(i,j,c): arr[i][j] = c build_grid() arr[i][j] = 0 def check_if_num_valid(i,j,num): #check row for i in arr[i]: if (num == i): return False #check column for i in arr[:,j]: if (num == i): return False #check box startRow = (i//3)*3 startCol = (j//3)*3 for x in range(0,3): for y in range(0,3): if arr[x startRow][y startCol] == num: return False return True build_grid() print(arr)
Может кто-нибудь, пожалуйста, помочь мне решить эту проблему?
Комментарии:
1. Ваши циклы
check_if_num_valid
изменяют значениеi
.2. Если ваш массив содержит 9 элементов, то самый высокий индекс
8
связан с тем, что python проиндексирован на 0. Ваш код проверяет наличие индекса9
или десятого элемента массива длиной 93. всегда помещайте полное сообщение об ошибке (начинающееся со слова «Обратная связь») в вопрос (не в комментариях) в виде текста (не скриншот, не ссылка на внешний портал). Есть и другая полезная информация.
4. ошибка показывает, в какой строке проблема, поэтому сначала вы можете
print()
посмотреть, что у вас есть в переменных в этой строке. Это должно помочь вам понять, в чем проблема.
Ответ №1:
Сначала вы присваиваете значения i
при запуске функции
def check_if_num_valid(i,j,num):
но позже вы измените значение i
с помощью for
-loop`
for i in arr[i]: for i in arr[:,j]:
и позже это создает проблему, потому что он использует неправильное значение i
в
startRow = (i//3)*3
Вы должны использовать другое имя в for
циклах- ie. value
for value in arr[i]: if num == value: return False for value in arr[:,j]: if num == value: return False