【问题标题】:alogrithim possible values java sudoku算法可能值java数独
【发布时间】:2011-05-29 02:28:59
【问题描述】:

我哪里出错了?这似乎不起作用。我试图在参数中指定一个 i 和 j 来定位单元格。并返回 9 x 9 数独网格中的可能值。 如果单元格为空,则第一个数组即 a[0]= true 和正在播放或占用的单元格则为 false。 数组的其余部分由值组成,这些值是可以插入到 i 和 j 单元格的可能值。因此一个可能的值是 4 那么它将返回 a[4]= true 并且布尔数组的其余部分是可能的。谁能告诉我哪里出错了? while循环不正确吗?

   public boolean[] getPossible( int i, int j)
   {

    final int booArraySize = 10;
    boolean[] possibleArray = new boolean[booArraySize];
    int zero = 0;
    if ( game[i][j] == 0)
    {

        for( int b=1; b < possibleArray.length; b++)
        {
            possibleArray[b] = true;
        }

        int row=i;
        int col= 0;

        int[] copyy = new int[GRID_SIZE];
        for( int m = 0; m < copyy.length; m++)
        {
            copyy[m] = 1;
        }

        while ( (copyy[0] < 10) && (copyy[0] >0))
        {
            for ( int q= col+1; q < game.length; q++)
            {
                if( copyy[0] == game[row][q])
                {
                    possibleArray[q] = false;
                }
                else
                {
                    possibleArray[q] = possibleArray[q];
                }
            }
            copyy[0] = copyy[0] + 1;

        }
         possibleArray[0]= true;
    }

    return possibleArray;
}

【问题讨论】:

  • 游戏数据结构代表什么?
  • 颂歌中的第一个奇怪的事情是您总是使用copyy[0],而从未使用该数组的任何其他元素。第二件事是,只要同一列中的单元格不包含 copyy[0]possibleArray[q] 就会设置为 true,因此基本上,除非该列中的 每个 单元格为 4,否则 4 是可能的。
  • 我假设game 是数独板的二维数组,包含单元格中的数字,0 表示空白。
  • 是的,但我在末尾将 copy[0] 元素加一,这样它就可以检查从 1 到 9 的所有值,而不是零。
  • 那么现在的“错误”是什么:您是否明白所有数字都是可能的,即使有些数字不是?

标签: java arrays boolean sudoku


【解决方案1】:

据我了解,您正在尝试将possibleArray 设置为true 在对应于允许值的位置。您似乎正在扫描游戏板并进行一些测试,以确定何时将每个索引位置设置为true。我建议您颠倒您的逻辑:将所有值设置为possibleArraytrue,然后扫描板以查找排除特定值的值。您可以通过使用与 (i, j) 相关的每个位置的游戏板值作为索引来将 possibleArray 设置为 false 来做到这一点,如以下伪代码所示:

// initialize possibleArray to true at all positions
for (each board position u,v along row i, column j, and square containing (i,j)) {
    possibleArray[game[u][v]] = false;
}
possibleArray[0] = true; // do this after instead of before

对于空的游戏位置,这会将 possibleArray[0] 设置为 false,但您可以在循环退出后修复它。

编辑:

这是我同时处理行和列的尝试。它不处理包含位置 (i,j) 的 3x3 框;这留作练习。 :)

public boolean[] getPossible( int i, int j)
   {

    boolean[] possibleArray = new boolean[10];
    if (game[i][j] == 0)
    {
        for( int b=1; b < 10; b++)
        {
            possibleArray[b] = true;
        }

        for (int n = 1; n < GRID_SIZE; ++n) {
            possibleArray[game[i][n]] = possibleArray[game[n][j]] = false;
        }
        // TODO Scan the 3x3 square containing cell (i,j)
        possibleArray[0]= true;
    }
    return possibleArray;
}

我假设(根据您的代码)从 game[1][1] 到 game[GRID_SIZE][GRID_SIZE] 是游戏板的正确索引范围。

【讨论】:

  • 它现在给了我 true 和 false 但它们似乎不正确,好像说 8 已经存在于该行中,然后它返回 true 为 a[8]= true 而不是 false。很奇怪
  • 您在游戏板上的一维迭代。您不需要在两者中进行迭代(沿行和列检查)吗?
  • 是的,但我认为我可以单独完成,第一行然后列。
  • 将行和列放在一起可能更容易。我已经发布了一些代码。
  • 是的,非常感谢它的工作。生病尝试做子网格:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 2015-01-10
  • 1970-01-01
相关资源
最近更新 更多