gpt4 book ai didi

Java:数独 - 增加空格数量会导致我的代码抛出异常

转载 作者:行者123 更新时间:2023-12-02 06:00:28 25 4
gpt4 key购买 nike

我正在尝试为我的项目制作一个数独游戏,但如果我增加数独Grid中的空白空间数量,代码只会抛出异常arrayoutofbounds但是无法弄清楚它来自哪里。 k 是网格中空白空间的数量。

我没有尝试过任何东西,因为不知道如何解决这种问题

代码如下:

package sudoku.puzzle;
import java.util.*;

public class SudokuPuzzle {

int[] mat[];
int N; // number of columns/rows.
int SRN; // square root of N
int K; // No. Of missing digits

// Constructor
SudokuPuzzle(int N, int K) {
this.N = N;
this.K = K;

// Compute square root of N
Double SRNd = Math.sqrt(N);
SRN = SRNd.intValue();

mat = new int[N][N];
}
// Driver code
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Select Level Of Difficulty \n 1.Easy\n 2.Medium\n 3.Hard");
String Choice = in .next(); in .close();
if ("1".equals(Choice) || "Easy".equals(Choice) || "easy".equals(Choice) || "e".equals(Choice) || "E".equals(Choice)) {
int N = 9, K = 40;
SudokuPuzzle sudoku = new SudokuPuzzle(N, K);
sudoku.fillValues();
sudoku.printSudoku();
}
if ("2".equals(Choice) || "Medium".equals(Choice) || "medium".equals(Choice) || "m".equals(Choice) || "M".equals(Choice)) {
int N = 9, K = 60;
SudokuPuzzle sudoku = new SudokuPuzzle(N, K);
sudoku.fillValues();
sudoku.printSudoku();
}
if ("3".equals(Choice) || "Hard".equals(Choice) || "hard".equals(Choice) || "h".equals(Choice) || "H".equals(Choice)) {
int N = 9, K = 72;
SudokuPuzzle sudoku = new SudokuPuzzle(N, K);
sudoku.fillValues();
sudoku.printSudoku();
}
}

// Sudoku Generator
public void fillValues() {
// Fill the diagonal of SRN x SRN matrices
fillDiagonal();

// Fill remaining blocks
fillRemaining(0, SRN);

// Remove Randomly K digits to make game
removeKDigits();
}

// Fill the diagonal SRN number of SRN x SRN matrices
void fillDiagonal() {

for (int i = 0; i < N; i = i + SRN)

// for diagonal box, start coordinates->i==j
fillBox(i, i);
}

// Returns false if given 3 x 3 block contains num.
boolean unUsedInBox(int rowStart, int colStart, int num) {
for (int i = 0; i < SRN; i++)
for (int j = 0; j < SRN; j++)
if (mat[rowStart + i][colStart + j] == num)
return false;

return true;
}

// Fill a 3 x 3 matrix.
void fillBox(int row, int col) {
int num;
for (int i = 0; i < SRN; i++) {
for (int j = 0; j < SRN; j++) {
do {
num = randomGenerator(N);
}
while (!unUsedInBox(row, col, num));

mat[row + i][col + j] = num;
}
}
}

// Random generator
int randomGenerator(int num) {
return (int) Math.floor((Math.random() * num + 1));
}

// Check if safe to put in cell
boolean CheckIfSafe(int i, int j, int num) {
return (unUsedInRow(i, num) &&
unUsedInCol(j, num) &&
unUsedInBox(i - i % SRN, j - j % SRN, num));
}

// check in the row for existence
boolean unUsedInRow(int i, int num) {
for (int j = 0; j < N; j++)
if (mat[i][j] == num)
return false;
return true;
}

// check in the row for existence
boolean unUsedInCol(int j, int num) {
for (int i = 0; i < N; i++)
if (mat[i][j] == num)
return false;
return true;
}

// A recursive function to fill remaining
// matrix
boolean fillRemaining(int i, int j) {
// System.out.println(i+" "+j);
if (j >= N && i < N - 1) {
i = i + 1;
j = 0;
}
if (i >= N && j >= N)
return true;

if (i < SRN) {
if (j < SRN)
j = SRN;
} else if (i < N - SRN) {
if (j == (int)(i / SRN) * SRN)
j = j + SRN;
} else {
if (j == N - SRN) {
i = i + 1;
j = 0;
if (i >= N)
return true;
}
}

for (int num = 1; num <= N; num++) {
if (CheckIfSafe(i, j, num)) {
mat[i][j] = num;
if (fillRemaining(i, j + 1))
return true;

mat[i][j] = 0;
}
}
return false;
}

// Remove the K no. of digits to
// complete game
public void removeKDigits() {
int count = K;
while (count != 0) {
int cellId = randomGenerator(N * N);

// System.out.println(cellId);
// extract coordinates i and j
int i = (cellId / N);
int j = cellId % 9;
if (j != 0)
j = j - 1;

// System.out.println(i+" "+j);
if (mat[i][j] != 0) {
count--;
mat[i][j] = 0;
}
}
}

// Print sudoku
public void printSudoku() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
System.out.print(mat[i][j] + " ");
System.out.println();
}
System.out.println();
}
}

最佳答案

你得到的可能是 ArrayIndexOutOfBoundsException 。这意味着在某些时候您尝试访问数组边界之外的数组字段。

但我看不到K在哪里可能对此负责。您能提供有关该错误的更多信息吗?例如。您在哪个值或在哪一行获得它。

编辑:变量 i int removeKDigits()如果随机生成器输出值 81,则函数超出数组的边界.

关于Java:数独 - 增加空格数量会导致我的代码抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55981204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com