Я не буду пытаться разгадывать весь ваш код. Я собираюсь предложить базовый процесс c для решения этой проблемы.
Во-первых, вы работаете на объектно-ориентированном языке программирования. Я бы начал с создания класса SudokuPuzzle. Я бы дал ему следующие методы (для начала):
class SudokuPuzzle {
// A constructor that initializes to all zeros.
public SudokuPuzzle() { ... }
// Create a legal finished board
public randomizeBoard() { ... }
// Take the legal board and hide some squares to make it a puzzle
public turnIntoAPuzzle() { ... }
// Output
public display() { ... }
}
Это даст вам красивый, чистый объект для работы, и он разбивает вашу проблему на части, которыми легче управлять. Я думаю, вы обнаружите, что даже randomizeBoard () труден. В конце концов, примите во внимание правила судоку:
- Каждая строка должна содержать каждое число ровно один раз
- Каждый столбец должен содержать каждое число ровно один раз
- Каждый квадрат из 9 мини-квадраты должны содержать каждое число ровно один раз
Так что randomizeBoard () - нетривиальная задача. Я программирую компьютеры 45 лет, и у меня нет четкого представления о том, как бы я это написал.
Но ЗАТЕМ вы можете перейти в turnIntoAPuzzle (). На самом деле это, вероятно, более легкая проблема. Вы можете случайным образом выбрать ячейку и решить, можно ли безопасно скрыть эту ячейку в соответствии с заданными вами правилами. Например, в простом режиме, если эта ячейка скрыта:
- Можно ли определить ее на основе всех других ячеек в этом поле из 9?
- Можно ли определить на основе в этой строке?
- Можно ли определить на основе этого столбца?
Если да, то ячейку можно скрыть. Вы можете использовать случайную функцию для поиска ячеек, которые еще не скрыты, и go по вашим правилам.
Для средней жесткости добавьте такие правила, как:
- Могу ли я определить это ячейка, основанная на комбинации этого квадрата 9, этой строки и этого столбца?
Если в какой-то момент все ваши тесты вернут «нет, я не могу», вы удалите это ячейку из будущего рассмотрения скрытия и случайным образом выбираем из оставшихся еще не скрытых ячеек.
L oop до тех пор, пока список ячеек «возможно скрыть» не станет нулевым.
-
В этом сообщении представлен образец того, как решать подобные проблемы. Сломай. Подумайте, как бы вы сделали это вручную, без компьютера, а затем превратите это в инструкции для компьютера.
Я думаю, что рандомизация платы на самом деле сложнее, чем скрытие некоторых ячеек, потому что это довольно простой алгоритм. Я не уверен, что рандомизировать доску просто, но, может быть, это действительно неплохо. Но я думаю, что можно go пойти по плохому пути.