Ваша основная проблема в том, что вы пытаетесь запустить функцию check3by3()
3 раза внутри цикла for
, но вы возвращаетесь из функции sudoku2()
после того, как первый вызов вернет True. Вы даже не попадаете во второй или третий ряд сетки 3х3. Я бы порекомендовал проверить False
возвращаемое значение из check3by3 и иметь sudoku2()
return True
только в том случае, если он действительно проходит весь цикл.
Как только вы это решили,следующая проблема, с которой вы столкнетесь, - это проблема с range()
в вашей функции check3by3()
. Если вы предоставите только один аргумент range()
, он проверит каждое значение от 0 до значения, которое вы ему передали. Итак, в первом цикле вы передаете его range(3)
, который будет работать нормально, так как вы хотите проверить строки 0, 1 и 2. Но как только вы доберетесь до следующего ряда сеток, вы будете вызывать range(6)
,где вы будете проверять все строки от 0-5.
Здесь нужно вместо добавления 3 к вызову check3by3
просто передать неизмененный номер строки и столбца, а затем вместо вызова range(row)
и range(column)
, вы хотите позвонить. range(row, row+3)
и range(column, column+3)
. Таким образом, когда вы проверяете вторую строку блоков 3х3, вы будете выполнять итерацию по range(3, 6)
(3, 4, 5) вместо range(6)
(0, 1, 2, ... 5)
Я не могу гарантировать, что после этого у вас не возникнет больше проблем;Я не выглядел очень тщательно на всю программу, но это должно привести вас на правильный путь к решению вашего непосредственного вопроса.