java数独生成器循环
我正在尝试制作一个数独生成器,这样我就可以制作成一个数独游戏,我遇到了一个问题。。。 我已经成功地提出了一种方法,可以检查某个单元格,以及其中的数字是否在它所属的同一行、同一列或3x3正方形中重复,但我在随机生成数字并填充这些数字时遇到了问题。 基本上首先,我用1-9的随机数填充第一行,这些随机数在这行中只出现一次。 我的问题是,有没有可能在一个又一个单元格中填入适合到目前为止生成的数字的随机数,或者我应该逐行填入?或者一个接一个?因为我的循环似乎变成了一个无限循环。代码如下:
package test;
import java.util.Random;
public class Test {
public static void main(String[] args) {
int[][]test=new int[9][9];
int[]prva=new int[]{1,2,3,4,5,6,7,8,9};
zapolniPrvo(test,prva);//fills the first line of the table
print(test);
System.out.println();
int y=1;
int x=0;
int rn=0;
int a=1;
for(int i=1;i<9;i++){
for(int j=0;j<9;j++){
while(!razlicnostT(j,i,test)){
test[i][j]=(int)(Math.random()*9+1);
}
}
}
print(test);
}
public static boolean razlicnostT(int y,int x,int[][]test){ //checks for same number in the line, row and square
int vrstica=0;
int kolona=0;
int yy=(y/3)*3;
int xx=(x/3)*3;
int yyy=(y%3);
int xxx=(x%3);
int kvadrat=0;
boolean razlicnost=false;
for(int i=yy;i<=yyy;i++){
for(int j=xx;j<=xxx;j++){
if(test[i][j]==test[y][x]){
kvadrat++;
}
}
}
for(int i=0;i<x;i++){
if(test[y][i]!=test[y][x]){
vrstica++;
}
}
for(int i=0;i<y;i++){
if(test[i][x]!=test[y][x]){
kolona++;
}
}
if((vrstica==x) && (kolona==y)&&(test[y][x]!=0)&&(kvadrat!=1)){
razlicnost=true;
} else {
razlicnost=false;
}
return razlicnost;
}
public static void zapolniPrvo(int[][]test,int[]prva){
randomize(prva);
for(int i=0;i<9;i++){
test[0][i]=prva[i];
}
}
public static void print(int[][]test){
for(int i=0;i<test.length;i++){
for(int j=0;j<test.length;j++){
System.out.print(test[i][j]+" ");
}
System.out.println();
}
}
public static void randomize (int[]temp){
Random rnd = new Random();
for (int i = temp.length - 1; i > 0; i--){
int index = rnd.nextInt(i + 1);
int a = temp[index];
temp[index] = temp[i];
temp[i] = a;
}
}
}
注意:如果数字在行/列/3x3正方形中只出现一次,并且测试是表格,则Razlicnost返回true
# 1 楼答案
从我所看到的引起问题的陈述是
if((vrstica==x) && (kolona==y)&&(test[y][x]!=0)&&(kvadrat!=1)){ razlicnost=true;
由于
razlicnost
最初被设置为false,所以这个语句显然永远不会为true,这会导致while(!razlicnostT(j,i,test)
无限运行这肯定是应用程序逻辑中的错误。不幸的是,我无法帮助你,因为你的代码
y
、yy
、xxx
这样的名称是将来任何人查看代码的噩梦)我的建议是重写这段代码,使其更具可读性,因为修复它可能需要更长的时间