Я пытаюсь сделать решатель судоку в Java, но это, похоже, не работает.
Мое намерение состоит в том, чтобы заполнить 2-D ArrayList целочисленными массивами, содержащими возможные решения. Таким образом, для каждой ячейки он проверяет числа, которые могут быть помещены в эту ячейку. Он проверяет строку, столбец и квадрат, в котором он находится. Если существует только одно возможное решение, то это сохраняется в качестве окончательного ответа. Код должен выполняться до тех пор, пока все целочисленные массивы не будут иметь размер один, т.е. они не достигнут окончательного ответа.
Вот мой код:
import java.util.ArrayList;
import java.util.Scanner;
import static sun.security.krb5.Confounder.intValue;
public class SudokuBoard {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
ArrayList<ArrayList<ArrayList<Integer>>> col = new ArrayList<ArrayList<ArrayList<Integer>>>();
int[] possible = {1, 2, 3, 4, 5, 6, 7, 8, 9};
for (int i = 1; i < 10; i++) {
ArrayList<ArrayList<Integer>> row = new ArrayList<ArrayList<Integer>>();
for (int j = 0; j < 9; j++) {
ArrayList<Integer> nums = new ArrayList<Integer>();
Integer integer = /**(int) (Math.random() * 10);*/scan.nextInt();
nums.add(integer);
row.add(nums);
}
col.add(row);
}
printArray(col);
boolean step = true;
ArrayList<ArrayList<ArrayList<Integer>>> place = new ArrayList<ArrayList<ArrayList<Integer>>>();
for (int i = 1; i < 10; i++) {
ArrayList<ArrayList<Integer>> row = new ArrayList<ArrayList<Integer>>();
for (int j = 0; j < 9; j++) {
ArrayList<Integer> nums = new ArrayList<Integer>();
Integer integer = 0;
nums.add(integer);
row.add(nums);
}
place.add(row);
}
int count = 0;
while(step) {
count++;
System.out.println(count);
step = false;
for (int h = 0; h < col.size(); h++) { //main logic for the code
for (int k = 0; k < col.get(h).size(); k++) {
boolean canAdd = false;
if (col.get(h).get(k).get(0).intValue() == 0) {
ArrayList<Integer> last = new ArrayList<Integer>();
for (int i = 1; i < 10; i++) {
ArrayList<Integer> left = toCompare(col, "h", h);
ArrayList<Integer> down = toCompare(col, "v", k);
ArrayList<Integer> square = toCompare(col, h, k);
boolean inL = false;
boolean inD = false;
boolean inS = false;
for (int j = 0; j < left.size(); j++) {
if (i == left.get(j).intValue()) {
inL = true;
}
}
for (int j = 0; j < down.size(); j++) {
if (i == down.get(j).intValue()) {
inD = true;
}
}
for (int j = 0; j < square.size(); j++) {
if (i == square.get(j).intValue()) {
inS = true;
}
}
if (!inL && !inD && !inS) {
last.add(i);
canAdd = true;
}
}
if(canAdd){
//last.add(0);
col.get(h).set(k, last);}
if(col.get(h).get(k).size() != 1 )//|| col.get(h).get(k).get(0).intValue() == 0)
{
step = true;
}
}
}
}
}
System.out.println();
printArray(col);
System.out.println(count);
}
public static ArrayList<Integer> toCompare(ArrayList<ArrayList<ArrayList<Integer>>> list, String type, int row) {
ArrayList<Integer> ints = new ArrayList<Integer>();
if (type.equals("h")) { // Checks the horizontal for used numbers
for (int i = 0; i < list.size(); i++) {
if (/**list.get(row).get(i).size() == 1 && */list.get(row).get(i).get(0).intValue() != 0) {
ints.add(list.get(row).get(i).get(0));
}
}
} else if (type.equals("v")) {//checks the vertical for used numbers
for (int i = 0; i < list.size(); i++) {
if (/**list.get(i).get(row).size() == 1 &&*/ list.get(i).get(row).get(0).intValue() != 0) {
ints.add(list.get(i).get(row).get(0).intValue());
}
}
}
return ints;
}
public static ArrayList<Integer> toCompare(ArrayList<ArrayList<ArrayList<Integer>>> list, int row, int col) {
int c = (int) (col / 3); //checks the square for used numbers.
int r = (int) (row / 3);
ArrayList<Integer> ret = new ArrayList<Integer>();
for (int i = r; i < r + 3; i++) {
for (int j = c; j < c + 3; j++) {
if (list.get(i).get(j).get(0).intValue() != 0/** && list.get(i).get(j).size() == 1*/) {
ret.add(list.get(i).get(j).get(0).intValue());
}
}
}
return ret;
}
public static void printArray(ArrayList<ArrayList<ArrayList<Integer>>> col) { //prints out the array.
for (int i = 0; i < col.size(); i++) {
for (int j = 0; j < col.get(i).size(); j++) {
System.out.print("" + (col.get(i).get(j).get(0).intValue()));
System.out.print(" ");
}
System.out.println();
}
}
}
Я не такой опытный, и я тоже пытался его отладить. Но это не будет работать так, как задумано.
Я уже видел код в Интернете о том, как это сделать, но я думаю, что лучше учиться по-своему.
Вся помощь приветствуется.