gpt4 book ai didi

Java 数独生成器无法正常工作

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:28:29 25 4
gpt4 key购买 nike

我一直在用 Java 开发数独谜题生成器,我编写了这个类来生成谜题,但它没有正确生成谜题。这是我得到的示例:

puzzle

如您所见,这不是有效的数独解决方案。但是看看我的代码,我不明白为什么它没有生成有效的谜题。有人可以解释为什么这不能正常工作吗?

package sudoku;

import java.util.Random;

public class Puzzle {

// number generator
Random gen = new Random();

// 9x9 puzzle
int puzzle[][] = new int[9][9];

public int[][] generate() {

// add each number to the board
for (int x = 0; x < 9; x++) {
for (int y = 0; y < 9; y++) {

boolean isValid = false;

// keep generating new numbers until a valid number is found
while (isValid == false) {

// generate random number 1-9
int num = gen.nextInt(9) + 1;

// check if number is valid
if (checkRow(num, x) == true || checkCol(num, y) == true
|| checkSection(num, x, y) == true) {

// add number to the board
puzzle[x][y] = num;

// exit loop
isValid = true;
}
}
}
}

return puzzle;
}

// check each element of the row for num, if num is found return false
private boolean checkRow(int num, int row) {

boolean valid = true;
for (int i = 0; i < 9; i++) {
if (puzzle[row][i] == num) {
valid = false;
break;
}
}

return valid;
}

// check each element of the column for num, if num is found return false
private boolean checkCol(int num, int col) {

boolean valid = true;
for (int i = 0; i < 9; i++) {
if (puzzle[i][col] == num) {
valid = false;
break;
}
}

return valid;
}

// check each element of the section for num, if num is found return false
private boolean checkSection(int num, int xPos, int yPos) {

int[][] section = new int[3][3];
section = getSection(xPos, yPos);

boolean valid = true;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (section[i][j] == num) {
valid = false;
break;
}
}
}

return valid;
}

// return the 3x3 section the given coordinates are in
private int[][] getSection(int xPos, int yPos) {

int xIndex = 0;
int yIndex = 0;
int[][] section = new int[3][3];

// get x index
if (xPos == 0 || xPos == 3 || xPos == 6) {
xIndex = xPos;
} else if (xPos == 1 || xPos == 4 || xPos == 7) {
xIndex = xPos - 1;
} else if (xPos == 2 || xPos == 5 || xPos == 8) {
xIndex = xPos - 2;
}

// get y index
if (yPos == 0 || yPos == 3 || yPos == 6) {
yIndex = yPos;
} else if (yPos == 1 || yPos == 4 || yPos == 7) {
yIndex = yPos - 1;
} else if (yPos == 2 || yPos == 5 || yPos == 8) {
yIndex = yPos - 2;
}

int i = 0;
int j = 0;
// extract section from puzzle
for (int x = xIndex; x < 3; x++) {
for (int y = yIndex; y < 3; y++) {
section[x][y] = puzzle[i][j];
i++;
}
j++;
}

return section;

}
}

最佳答案

仅行、列或部分有效是不够的。它们都必须有效。因此,更改此行:

if (checkRow(num, x) == true || checkCol(num, y) == true || checkSection(num, x, y) == true) 

if (checkRow(num, x) == true && checkCol(num, y) == true && checkSection(num, x, y) == true) 

或者只是简单的

if (checkRow(num, x) && checkCol(num, y) && checkSection(num, x, y)) {

关于Java 数独生成器无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17119203/

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