Как заполнить матрицу(игра Судоку) числами в заданном диапазоне, без повтора в строке и столбце?
Класс содержит следующие методы:
private static long counter; // для подсчета созданных игровых досок
private static int[][] data;
public static int[][] getSuccessRandomTable() { // проверка созданного игрового поля, на правильность заполнения
LocalDateTime from = LocalDateTime.now();
boolean isValid;
int[][] data;
do {
data = getRandomTable();
isValid = TableValidator.checkTable(data);
TableOut.printTable(data);
}
while (!isValid);
LocalDateTime to = LocalDateTime.now();
System.out.println("Заняло времени в секундах " + Duration.between(from, to).toSeconds());
return data;
}
private static int[][] getRandomTable() { //создание игрового поля
int[][] data = new int[Constants.TABLE_SIZE][Constants.TABLE_SIZE];
final int min = 1; // Минимальное число для диапазона
final int max = 9; // Максимальное число для диапазона
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data.length; j++) {
int rnd = rnd(min, max);
data[i][j] = rnd;
}
}
counter++;
System.out.println("Игровых досок создано " + counter);
return data;
}
private static int rnd(int min, int max) { //генерация случайного числа от 1 до 9
max -= min;
return (int) (Math.random() * ++max) + min;
}
Метод getRandomTable()
заполняет матрицу 9*9 значениями из диапазона 1-9.
Метод getSuccessRandomTable()
проверяет заполненную матрицу на валидность
Пытаюсь понять, как добавить проверку т.е. доработать getRandomTable()
так, чтобы он заполнял построчно значениями из диапазона, без повтора по вертикали и горизонтали, т.е. в ячейку [0][0] записывает число от 1-9, пусть будет 3, шагает к следующей ячейке, проверяю линию, тройка есть, значит нужно записать число от 1-9 за исключением 3 и так далее. В дальнейшем потребуется сделать дополнительную проверку на"малые квадраты"(data[0][0]-data[0][2]; data[1][0]-data[1][2]; data[2][0]-data[2][2]), чтобы в них значения так же были только от 1-9 без повтора.