Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数独-区域测试_Java_Sudoku - Fatal编程技术网

Java 数独-区域测试

Java 数独-区域测试,java,sudoku,Java,Sudoku,我正在使用“蛮力”随机方法创建一个数独生成器。我已经能够使用以下代码检查x/y轴是否有重复的数字: for(l=0; l<9; l++){//Makes all vertical work. if(sudoku[l][j] == temp){ isUsed=true; } }

我正在使用“蛮力”随机方法创建一个数独生成器。我已经能够使用以下代码检查x/y轴是否有重复的数字:

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;
    }