0

我正在创建一个数独生成器,使用“蛮力”随机方法。我已经能够使用以下代码检查 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;
                   }
                }

我决定实施“盒子”或“区域”检查(从原点开始检查每个 3x3 方格),但我似乎无法完全理解代码。这是我到目前为止所做的。我只是不太清楚我的逻辑错误在哪里(作为记录,程序将使用此代码运行,但不会正确检查区域)

rowbase = i-(i%3);
                if(i==2  || i==5 || i==8 ){
                    if(rowbase == 0 || rowbase == 3 || rowbase == 6){
                       isUsed= RegionCheck.RegCheck(rowbase, sudoku);
                    }
                }

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;

一路走来,我只是迷路了,不了解如何“选择”一个区域并遍历区域。

完整来源:http: //ideone.com/FYLwm

任何关于如何“选择”一个区域进行测试然后迭代它的帮助将不胜感激,因为我真的没有想法。

4

2 回答 2

1

你需要把它抽象一点。这样想,任何区域(框、列、行)都只是一个值列表(和空值)。要检查一个值是否x可以插入到区域R中,只需将其中的所有值表示为值R列表L。现在您需要做的就是检查是否L包含x

祝你好运!

于 2012-05-11T13:28:19.263 回答
0

我不明白你是什么意思测试一个区域,我假设测试意味着每个区域都有从 1 到 9 的每个数字而没有重复。

我们可以进行可能的实现:

  1. 用于垂直、水平和 3x3 区域的 for 循环。
  2. 使用对每个区域都有位置的表格,包括水平或垂直的。

我的推荐是第二个。如果您有一个表,则执行一次访问区域的循环。另一方面,第一个需要为垂直/水平/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++;
}

生成垂直或水平区域的代码很容易阅读。虽然应该描述 3x3 区域生成。变量i取自 0 到 8,( (i/3)*3, (i%3)*3) 分别指向 3x3 区域的角。并且 ( +j/3, +j%3) 移动区域中的每个框。

sudoku您可以通过以下代码测试矩阵是否符合:

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

该数组counter计算每个数字的出现次数(我假设0是一些特殊含义,并且数字之间19有效的)。

于 2011-07-23T12:36:02.957 回答