Java 程序无故无限运行 - 没有 StackOverflow 但程序永远不会终止 - 数独生成器
Java Program runs infinitely with no cause- No StackOverflow but program never terminates - Sudoku generator
我正在尝试在 java 9+ 中构建一个基本的数独生成器。
该代码在一个随机点停止返回新数字之前似乎工作正常,但是生成随机数的函数仍然会产生数字,正如我用日志测试的那样。但它达到某个数字并停止打印。我不知道为什么。我对算法和回溯非常陌生,因此非常感谢您提供的任何见解。
下面的代码
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
class Scratch_5
{
static boolean safe = true;
static int[][] grid = new int[9][9];
public static void main(String[] args)
{
for(int i = 0; i < grid.length; i++)
{
for(int j = 0; j < grid[i].length; j++)
{
int temp = 0;
do
{
temp = getNumber();
}while (!noConflict(grid, i, j, temp));
grid[i][j] = temp;
System.out.print(grid[i][j] + " ");
}
System.out.println();
}
}
static int getNumber()
{
Random r = new Random();
int temp = 0;
temp = r.nextInt(10-0);
return temp;
}
public static boolean noConflict(int[][] array, int row, int col, int num) {
for (int i = 0; i < 9; i++) {
if (array[row][i] == num) {
return false;
}
if (array[i][col] == num) {
return false;
}
}
int gridRow = row - (row % 3);
int gridColumn = col - (col % 3);
for (int p = gridRow; p < gridRow + 3; p++) {
for (int q = gridColumn; q < gridColumn + 3; q++) {
if (array[p][q] == num) {
return false;
}
}
}
return true;
}
}
谢谢。
你的逻辑有问题。您将创建无法完成的配置,因此您将陷入 do while 循环。让我用一个简单的例子来证明这一点:
1 2 3 4 5 6 7 8 9
4 5 6 1 2 3 . . .
任何带点的位置都不能填,因为方框里已经有7、8或9了。
您可以编写数独求解器,然后将随机数放入网格中并尝试求解。一旦有一个唯一的解决方案(这可以通过从底部解决来检查,尝试 1 然后 2 然后 3 等等,从顶部尝试先尝试 9 然后 8 然后 7 等等,如果 2 个解决方案匹配它是独一无二的),您有一个数独(不是您尝试生成的已解决的数独)。
我正在尝试在 java 9+ 中构建一个基本的数独生成器。
该代码在一个随机点停止返回新数字之前似乎工作正常,但是生成随机数的函数仍然会产生数字,正如我用日志测试的那样。但它达到某个数字并停止打印。我不知道为什么。我对算法和回溯非常陌生,因此非常感谢您提供的任何见解。
下面的代码
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
class Scratch_5
{
static boolean safe = true;
static int[][] grid = new int[9][9];
public static void main(String[] args)
{
for(int i = 0; i < grid.length; i++)
{
for(int j = 0; j < grid[i].length; j++)
{
int temp = 0;
do
{
temp = getNumber();
}while (!noConflict(grid, i, j, temp));
grid[i][j] = temp;
System.out.print(grid[i][j] + " ");
}
System.out.println();
}
}
static int getNumber()
{
Random r = new Random();
int temp = 0;
temp = r.nextInt(10-0);
return temp;
}
public static boolean noConflict(int[][] array, int row, int col, int num) {
for (int i = 0; i < 9; i++) {
if (array[row][i] == num) {
return false;
}
if (array[i][col] == num) {
return false;
}
}
int gridRow = row - (row % 3);
int gridColumn = col - (col % 3);
for (int p = gridRow; p < gridRow + 3; p++) {
for (int q = gridColumn; q < gridColumn + 3; q++) {
if (array[p][q] == num) {
return false;
}
}
}
return true;
}
}
谢谢。
你的逻辑有问题。您将创建无法完成的配置,因此您将陷入 do while 循环。让我用一个简单的例子来证明这一点:
1 2 3 4 5 6 7 8 9
4 5 6 1 2 3 . . .
任何带点的位置都不能填,因为方框里已经有7、8或9了。
您可以编写数独求解器,然后将随机数放入网格中并尝试求解。一旦有一个唯一的解决方案(这可以通过从底部解决来检查,尝试 1 然后 2 然后 3 等等,从顶部尝试先尝试 9 然后 8 然后 7 等等,如果 2 个解决方案匹配它是独一无二的),您有一个数独(不是您尝试生成的已解决的数独)。