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

Java:数独游戏:检查3x3网格中的重复值,java,sudoku,Java,Sudoku,此程序的作用: 这个程序从一个类中获取值,并使用这些值作为数独游戏的起始值。我们将在典型的数独9x9网格中打印这些内容。然后,程序会提示用户在网格上指定一个坐标点,并在其中输入一个值。目前我正在做的是确保用户输入的值对解决这个难题是有效的。填好拼图后,每列、每行和3x3方块中不再有任何重复值,游戏应结束,输出应为“拼图完成” 到目前为止,我的程序成功地检查了列和行中的重复值,但我不知道从哪里开始检查每个3x3正方形 此拼图的数字保存在9x9数组中 基本上:关于如何检查数组中每个3x3部分的重复值

此程序的作用:

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

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

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


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

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

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

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


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

大约4年前,我用C编写了以下代码来解决完全相同的问题,尽管它看起来像蛮力一样。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复选框(int a[][9],int索引)
{
int i,j,isValid=1;
int m,n;
对于(i=3*(索引%3);isValid&(i<(3*(索引%3)+3));i++)
{
对于(j=3*(索引/3);isValid&(j<3*(索引/3)+3));j++)
{
对于(m=(3*(索引%3));isValid&(m<(3*(索引%3)+3));m++)
{
对于(n=3*(索引/3);isValid&(n<3*(索引/3)+3));n++)
{
如果(isValid&(a[m][n]==0)| |((i!=m)| |(j!=n))&&&(a[i][j]==a[m][n])/选择给定的元素并将其他元素与之进行比较
{//如果任何元素与它本身不同,那么数独就无效
isValid=0;//此选项检查3x3框
}                                                               
}                                               
}                                                   
}
}
返回有效;
}   
基本上,我所做的只是操纵索引,直到它选择了一个特定的框,在这个框中,我检查了所有的数字,看看是否有任何类型的匹配。如果存在匹配项,则数独无效

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

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;
}
int checkSudoku(int a[][9])//检查每行、每列和每框
{//如果没有矛盾,那么它是有效的
int i,isValid=1;
对于(i=0;isValid&(i<9);i++)
{
isValid=(选中行(a,i)和选中列(a,i)以及复选框(a,i));
}
返回有效;
}

当然,考虑到Java只是数组管理,同样的概念也可以应用于Java。

发布您用于9x9网格的代码。for(int i=0;i<9;i++)for(int j=0;j<9;j++){puzzle[i][j]=Integer.toString(Constants.game[i][j]);