Ошибка индекса: индекс 9 выходит за рамки для оси 0 с размером 9. Ошибка при кодировании решателя судоку

#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 или десятого элемента массива длиной 9

3. всегда помещайте полное сообщение об ошибке (начинающееся со слова «Обратная связь») в вопрос (не в комментариях) в виде текста (не скриншот, не ссылка на внешний портал). Есть и другая полезная информация.

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