当前位置: 首页 > 知识库问答 >
问题:

Java:数独游戏:检查3x3网格中的重复值

越英范
2023-03-14

这个程序的作用:

这个程序从一个类中获取值,并使用这些值作为数独游戏的起始值。我们将在一个典型的数独9x9网格中打印这些内容。然后,程序会提示用户在网格上给出一个坐标点,并在其中输入一个值。目前我正在做的是确保用户输入的值对解决这个难题是有效的。填好拼图后,每列、每行和3x3方块中不再有任何重复值,游戏应结束,输出应为“拼图完成”。

到目前为止,我的程序成功地检查了列和行中的重复值,但我不知道从哪里开始检查每个3x3正方形。

此拼图的数字保存在9x9数组中。

基本上:关于如何检查数组中每个3x3部分的重复值,有什么建议吗?

共有3个答案

颜高格
2023-03-14

大约4年前,我用C编写了以下代码来解决完全相同的问题,但它看起来就像蛮力y一样。int数组是一个9x9网格。“索引”指定0...第8行、0...第8列和0...第8个框。

int checkBox(int a[][9], int index)
{
    int i, j, isValid = 1;
    int m, n;
    for(i = 3*(index%3) ; isValid && (i < (3*(index%3) + 3)); i++)
    {
        for(j = 3*(index/3); isValid && (j < (3*(index/3) + 3)); j++)
        {
            for(m = (3*(index%3)) ; isValid && (m < (3*(index%3) + 3)); m++)
            {
                for(n = 3*(index/3); isValid && (n < (3*(index/3) + 3)); n++)
                {
                    if(isValid && (a[m][n] == 0) || ((i != m) || (j != n)) && (a[i][j] == a[m][n]))     //select given element and compare others to it
                    {                                                                         //if any element is the same that is not itself then the sudoku is not valid
                        isValid = 0;                                                  //this checks for 3x3 box
                    }                                                               
                }                                               
            }                                                   
        }
    }
    return isValid;
}   

基本上,我所做的只是操纵索引,直到它选择了一个特定的框,在那个框中,我检查了所有数字,看看是否有任何匹配。如果有匹配,数独就无效。

最后,我这样检查了有效性:

int checkSudoku(int a[][9])                                     //check every row, column and box
{                                                   //if there is no contradiction then it is valid
    int i, isValid = 1;
    for(i = 0; isValid && (i < 9); i++)
    {
        isValid = (checkLine(a, i) && checkColumn(a, i) && checkBox(a, i));
    }
    return isValid;
}

当然,同样的概念也适用于Java,因为它只是数组管理。

万俟招
2023-03-14

这取决于你如何存储数独板。如果将其存储为二维数组,则可以让逻辑标识用户选择输入新值的3x3框,并使用已经检查行和列部分的代码。

你还可以收集9套。每一组对应一个特定的3x3区块。因此,当用户选择他/她想要添加值的位置的坐标时,您将选择给定的集合,并在集合中执行add操作。

由于集合不允许重复,如果集合中已经存在数字,add方法将返回false。这也将允许您识别任何重复的值(但是,与数组选项不同,如果用户选择从3x3网格中删除值,您还需要更新集合)。

诸葛雅达
2023-03-14

我要做的不是一个大的9x9数组,而是存储一个由3x3个数字数组组成的3x3数组。或者两者都做,以便于计算(再存储81字节的数据(我希望字段使用字节吗?)这不会在所有的设备上造成内存问题(除了内存不足最多的设备,我怀疑你是否愿意在这样的设备上玩游戏)。

 类似资料:
  • 我曾经用C语言编写过一个数独谜题,但我陷入了一个问题:检查每个3x3网格是否没有重复的值。这是我的代码: 我知道在function Valid中,我应该有条件检查每个3x3网格,但我没有弄明白:我找到了创建一些变量开始和结束的解决方案,每个变量得到如下结果: 在我的例子中,i和j是ii和jj。 例如,我们发现了这样的东西: 我试过这个密码,但没用。 我不明白这一点:我有下一个数独矩阵: 如果我的代

  • 我已经创建了一个程序,允许用户输入一个数独拼图的所有值,即9x9,将这些值存储在一个数组中,并可以检查所有行和列中的值是否不同,但我很难理解如何实现代码来关注3x3的每个子网格。我想我必须有最后一个嵌套for循环,它可能被3除,但我完全被这部分卡住了。 }

  • 我正在编写一个Android应用程序,从图片中提取数独谜题。对于9x9数独网格中的每个单元格,我需要确定它是包含数字1到9中的一个还是空白。以下是我的算法的大致要点: 自适应阈值拼图 扩展以减少要考虑的轮廓数 找到拼图的轮廓并将其扭曲成正方形 将正方形分成81个相等的单元格;寻找至少有20%白色像素的单元格 找到最靠近这些单元格中心的白色斑点并得到其边界矩形 对边界矩形内的图像部分使用字符识别(k

  • 以下是我的方法: 我做了一个9x9二维整数数组来拼图。0表示只有一个空格。该方法检查每个3x3的正方形,并说明是否在其中一个正方形中发现了重复。但有时它仍然会说,有比赛时没有比赛。有人能看出哪里出了问题吗?

  • 我已经用Python为非常简单的数独问题编写了一个数独解算器。它的工作原理是检查每个空方块,如果只有一个可能的数字是合法的,则用该数字替换空方块。一旦它完成了整个拼图,如果仍然有1个以上的空方块,它会再次调用新的拼图。我遇到问题的部分是,我希望解算器在每次调用结束时检查谜题是否与调用开始时相同,如果没有更改,这意味着所有剩余的空方块都有超过1个可能值,因此解算器应返回False,以指示解算器无法解

  • 当我试图检查数独的行中是否有重复的元素时,结果什么也没有返回。不知道代码是否正确。如果在一行中找到重复的元素,则需要打印找到的重复项。使用方法帮助我找到解决方案。