import java.util.Scanner;
public class Sudoku {
public static void main(String[] args) {
int[][] grid = readAPuzzle();
if (!isValid(grid))
System.out.println("Invalid Input");
else if (search(grid)) {
System.out.println("The solution is found: ");
printGrid(grid);
} else
System.out.println("No solution");
}
public static int[][] readAPuzzle() {
Scanner input = new Scanner(System.in);
System.out.println("Enter a Soduku puzzle:");
int[][] grid = new int[9][9];
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
grid[i][j] = input.nextInt();
return grid;
}
public static int[][] getFreeCellList(int[][] grid) {
int numberOfFreeCells = 0;
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
if (grid[i][j] == 0)
numberOfFreeCells++;
int[][] freeCellList = new int[numberOfFreeCells][2];
int count = 0;
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
if (grid[i][j] == 0) {
freeCellList[count][0] = i;
freeCellList[count++][1] = j;
}
return freeCellList;
}
public static void printGrid(int[][] grid) {
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
System.out.print((grid[i][j] + " "));
System.out.println();
}
public static boolean search(int[][] grid) {
int[][] freeCellList = getFreeCellList(grid);
int k = 0;
boolean found = false;
while (!found) {
int i = freeCellList[k][0];
int j = freeCellList[k][1];
if (grid[i][j] == 0)
grid[i][j] = 1;
if (isValid(i, j, grid)) {
if (k + 1 == freeCellList.length) {
found = true;
} else {
k++;
}
} else if (grid[i][j] < 9) {
grid[i][j] = grid[i][j] + 1;
} else {
while (grid[i][j] == 9); {
grid[i][j] = 0;
if (k == 0) {
return false;
}
k--;
i = freeCellList[k][0];
j = freeCellList[k][1];
}
grid[i][j] = grid[i][j] + 1;
}
}
return true;
}
public static boolean isValid(int i, int j, int[][] grid) {
for (int column = 0; column < 9; column++)
if (column != j && grid[i][column] == grid[i][j])
return false;
for (int row = 0; row < 0; row++)
if (row != i && grid[row][j] == grid[i][j])
return false;
for (int row = (i / 3) * 3; row < (i / 3) * 3 + 3; row++)
for (int col = (j / 3) * 3; col < (j / 3) * 3 + 3; col++)
if (row != i && col != j && grid[row][col] == grid[i][j])
return false;
return true;
}
public static boolean isValid(int[][] grid) {
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
if (grid[i][j] != 0 && !isValid(i, j, grid)) return false;
return true;
}
}
这是我的代码。我不知道它有什么问题。我试图让用户输入Soduku拼图,并且所有空格都是空的(用0表示),填充正确的答案。我似乎有一个运行时错误,不会让代码执行,但我不知道它是什么。 Soduku糟透了...... 此外,我还是一名高中生,所以在使用我可能不会理解的任何术语时请记住这一点。 我想要包含一张图片,但它不让我。它说实体太大了,但这又是另一天的问题。
Enter a Soduku puzzle:
21213
123532653
35426
124
437
54723
362
537
643643436
34673754745
Exception in thread "main" java.util.InputMismatchException:
For input string: "34673754745"
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at Sudoku.readAPuzzle(Sudoku.java:22)
出现了什么。 我可以输入字母和数字而没有错误,但是当我超过9时,它会崩溃。此外,我似乎能够输入尽可能多的输入行。我想,它不知道何时实际执行。
答案 0 :(得分:0)
从您提供给程序的输入中,我了解到您没有编写上面发布的代码。这是因为您不了解该程序的基本要求。
该计划首先输入Sudoko中提供的所有线索。为此,您必须为给出提示的网格的每个单元格输入1到9之间的任何整数,并为空白的单元格输入0。
现在您输入了21213,123532653,35426,124,437,54723,362,537,643643436,34673754745,这些都是非法入境。条目应为0到9,并且提供的所有输入都超过9.
现在出现错误。行input.nextInt()
尝试从控制台读取用户输入的下一个int
。但您输入了long
值而不是int
作为最后一个输入值。因此,由于该值大于最大整数,即 2147483647 ,Scanner
类将其视为String
而不是整数。所以,你得到了运行时异常。
答案 1 :(得分:-1)
您必须并且应该使用分号(;)
结束包语句