В общем, есть 3 метода: checkLine, checkColumn и checkBlock, которые по отдельности работают, т.е заполняют таблицу цифрами от 1 до 9 без повторений либо в строку, в столбец, либо в блок 3х3. Но при объединении каких-либо 2-ух из них программа зацикливается. Как решить это - фиг знает.
Собственно сам код:
package sudoku; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; public class Numbers { static final int N = 9; static Random rnd = new Random(); static List<Integer>[] numbers = new ArrayList[N]; public Numbers() { for(int i = 0; i < N; i++) { numbers[i] = new ArrayList<>(); for(int j = 1; j <= N; j++) { if(i == 0) { numbers[i].add(j); } else { numbers[i].add(0); } } } Collections.shuffle(numbers[0]); } private boolean checkLine(int line, int value) { for(int i = 0; i < N; i++) { if(numbers[line].get(i) == value) { return false; } } return true; } private boolean checkColumn(int column, int value) { for(int i = 0; i < N; i++) { if(numbers[i].get(column) == value) { return false; } } return true; } private boolean checkMove(int l, int c, int r) { if(!checkLine(l, r)) { return false; } if(!checkColumn(c, r)) { return false; } if(!checkBlock(l, c, r)) { return false; } return true; } private boolean checkBlock(int line, int column, int value) { for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { if(numbers[line - (line % 3) + i].get(column - (column % 3) + j) == value) { return false; } } } return true; } public void generateSudoku() { boolean move = false; int r = 0; for(int line = 1; line < N; line++) { for(int column = 0; column < N; column++) { while(!move) { r = rnd.nextInt(9) + 1; move = checkMove(line, column, r); for(int i = 0; i < N; i++) { System.out.println(numbers[i].toString()); } System.out.println(" ------------------- "); } if(move) { numbers[line].set(column, r); move = false; } } } } public void printNumbers() { for(int i = 0; i < N; i++) { System.out.println(numbers[i].toString()); } } }
Зацикливается примерно в таких местах:
sud.jpg 88,29К 94 Количество загрузок
В данном случае остаётся в строку вставить только 3, но она уже есть в текущем блоке 3х3. Хочется добить, но самому не по зубам (