[英]I don't understand why my Java program doesn't run
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 時,它會崩潰。 此外,我似乎可以輸入任意多行的輸入。 我猜它不知道何時實際執行。
根據您提供給程序的輸入,我了解到您沒有編寫上面發布的代碼。 這是因為您不了解該程序的基本要求。
該程序首先輸入 Sudoko 中給出的所有線索。 為此,您必須為給出提示的網格的每個單元格輸入 1 到 9 之間的任何整數,並為空白單元格輸入 0。
現在你輸入了 21213, 123532653, 35426, 124, 437, 54723, 362, 537, 643643436, 34673754745 這些都是非法輸入。 因為條目應該是 0 到 9,並且提供的所有輸入都大於 9。
現在來到你的錯誤。 行input.nextInt()
嘗試從控制台讀取用戶輸入的下一個int
。 但是您輸入了一個long
值而不是int
作為最后一個 Input。 因此,由於該值大於最大整數,即2147483647 , Scanner
類將其視為String
而不是整數。 因此,您會收到運行時異常。
您必須並且應該以分號(;)結束包語句
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.