首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >比较数独Java块中的整数

比较数独Java块中的整数
EN

Stack Overflow用户
提问于 2012-02-17 05:05:51
回答 4查看 1.5K关注 0票数 0

你好,我在数独检查器上工作,它验证完成的板的解决方案是正确的。我现在对如何在块中进行检查感到困惑。现在,我有一个布尔值,如下所示,我正在检查左上角的块(Block1)。我不确定的是要设置哪些参数,以及如何成功运行这两个for循环。

问题是,我想检查一个压缩为3x3正方形的二维数组的一部分,看看该区域的整数是否没有重复,只有1-9出现一次。我有类似的代码,我在其中编写了这段代码,检查一行是否有重复的整数和一列。

代码语言:javascript
复制
static boolean isBlock1Valid(int[][] sudokuBoard, int referenceRow, int referenceColumn)
{

    for(int i =0; i<2;i++){
        for(int j=0; j<2; j++){
            if(sudokuBoard[i][j]==sudokuBoard[i][j])
                return false;
        }
    }
    return true;
}//end of isBlock1Valid

下面是我用来创建块检查器的行检查器

代码语言:javascript
复制
       static boolean IsValidRow(int[][] sudokuBoard, int referenceRow, int width)
{
    //Compare each value in the row to each other
    for(int i = 0; i < width; i++)
    {
        for(int j = i+1; j < width; j++)
        {

            if(sudokuBoard[referenceRow][i] == sudokuBoard[referenceRow][j])
                return false;

        }
    }

    return true;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-17 05:14:43

我不太确定你想让你的代码做什么。但是这个方法总是返回false。

如果您想要确保每个元素在一个块中只有一个实例。然后,一种解决方案是有一种检查表:

代码语言:javascript
复制
boolean[] seen = new boolean[9];

for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++)
        if (seen(sudokuBoard[referenceColumn+i][referenceRow+j])) return false;
        else seen[sudokuBoard[referenceColumn+i][referenceRow+j]) = true;
return true;
票数 0
EN

Stack Overflow用户

发布于 2012-02-17 05:17:47

因为这是家庭作业,所以只是一个提示。模3 (i % 3)和整数除以3 (i / 3)可用于分割坐标0。8分成3个部分,并在该部分中建立索引。

票数 3
EN

Stack Overflow用户

发布于 2012-03-03 08:19:39

在您的IsValidRow方法中,您使用了两个嵌套循环。第一个循环遍历整行,第二个循环遍历该行的其余部分,以检查该值是否重复。在您的isBlock1Valid方法中,您还使用了两个嵌套循环。但是现在,您将外循环用于y坐标,将内循环用于x坐标。它们一起做你在IsValidRow中的第一个循环做的事情。循环遍历整组细胞。您仍然需要实现第二个循环,该循环遍历框的其余部分。不幸的是,对于嵌套循环,这并不容易。但就像Joop Eggen说的那样,你可以使用模数和整数除法来获得不同的余弦视图。例如,您可以说j % 3 + (i % 3) * 3是框内(j, i)的索引。这样,您只需要两个循环,就像在IsValidRow中一样

代码语言:javascript
复制
static boolean isBlock1Valid(int[][] sudokuBoard)
{
    for(int i = 0; i < 9; i++)
    {
        for(int j = i+1; j < 9; j++)
        {

            if(sudokuBoard[i/3][i%3] == sudokuBoard[j/3][j%3])
                return false;

        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9319061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档