Java 数独-区域测试
我正在使用“蛮力”随机方法创建一个数独生成器。我已经能够使用以下代码检查x/y轴是否有重复的数字:Java 数独-区域测试,java,sudoku,Java,Sudoku,我正在使用“蛮力”随机方法创建一个数独生成器。我已经能够使用以下代码检查x/y轴是否有重复的数字: for(l=0; l<9; l++){//Makes all vertical work. if(sudoku[l][j] == temp){ isUsed=true; } }
for(l=0; l<9; l++){//Makes all vertical work.
if(sudoku[l][j] == temp){
isUsed=true;
}
}
for(m=0; m<9; m++){//makes all horizontal work
if(sudoku[i][m] == temp){
isUsed=true;
}
}
regionCheck.java的内容:
boolean okay = false;
int[] regionUsed = new int[9];
int i=0, j=0, regionTester=0, counter=0, numcount;
for (i=regionTester; i<regionTester+3; i++){
for (; j<3; j++){
regionUsed[counter]=sudoku[i][j];
counter++;
}
}
for(i=0; i<9; i++){
numcount=regionUsed[i];
for(j=0; j<9; j++){
if(j==i){
//null
}
else if(numcount == regionUsed[j]){
okay=false;
}
}
}
return okay;
boolean OK=false;
int[]regionUsed=新int[9];
int i=0,j=0,regionTester=0,counter=0,numcount;
对于(i=regiontest;i我无法理解您测试区域的意思,
我假设测试意味着每个区域都有从1到9的数字,没有重复
我们可以采取以下措施:
用于垂直、水平和3x3区域的回路
使用对每个区域都有位置的表格,包括水平或垂直表格
我推荐第二个。
如果您有一个表,那么循环将只实现一次访问区域。
另一方面,第一个需要为垂直/水平/3x3实现3个类似的环路
以下是生成表的代码:
for(int i=0, k=0; i<9; i++) {
// generate vertical regions
for(int j=0; j<9; j++)
table[k][j] = new table_t(i, j);
k++;
// generate horizontal regions
for(int j=0; j<9; j++)
table[k][j] = new table_t(j, i);
k++;
// generate 3x3 regions
for(int j=0; j<9; j++)
table[k][j] = new table_t((i/3)*3+j/3, (i%3)*3+j%3);
k++;
}
数组计数器
统计每个数字的出现次数
(我假设0
是一些特殊的含义,1
和9
之间的数字是有效的)。你需要对它进行一点抽象。这样想,任何区域(框、列、行)都只是一个值列表(和空值)。要检查值x
是否可以插入到区域R
,只需将R
中的所有值表示为值列表L
。现在您需要做的就是检查L
是否包含x
祝你好运!可能的副本
for(int i=0, k=0; i<9; i++) {
// generate vertical regions
for(int j=0; j<9; j++)
table[k][j] = new table_t(i, j);
k++;
// generate horizontal regions
for(int j=0; j<9; j++)
table[k][j] = new table_t(j, i);
k++;
// generate 3x3 regions
for(int j=0; j<9; j++)
table[k][j] = new table_t((i/3)*3+j/3, (i%3)*3+j%3);
k++;
}
boolean okey = true;
for(int i=0; i<27; i++) {
int [] counter = new int[10];
for(int j=0; i<10; i++)
counter[i]=0;
for(int j=0; j<9; j++)
counter[ sudoku[table[i][j].x][table[i][j].y] ] ++;
boolean ok = true;
for(int j=0; j<9; j++)
if(counter[j+1]!=1)
ok = false;
if(!ok)
okey = false;
}