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

时间:2012-10-19 06:11:10

标签: java sudoku

该计划的作用:

此程序从类中获取值,并将其用作数独谜题的起始值。我们将在典型的Sudoku 9x9网格中打印出来。然后程序提示用户在网格上给出一个坐标点和一个放在那里的值。目前我正在研究的是确保用户输入的值对解决这个难题有效。一旦拼图完成并且每列,行和3x3平方不再有任何重复值,游戏应该结束并且输出应该是“拼图完成”。

截至目前,我的程序已成功检查列和行中的重复值,但我不知道从哪里开始检查每个3x3方块。

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

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

3 个答案:

答案 0 :(得分:0)

我所做的不是大型9x9阵列,而是存储一个3x3阵列的3x3数字阵列。或者两者兼而有之,为了便于计算(存储81个字节的数据(你确实使用字节用于我希望的字段?)除了大多数内存不足的设备外都不会导致内存问题,我怀疑你是否想要无论如何都要玩游戏。)

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我在大约4年前在C中编写了以下代码来解决完全相同的问题,但它看起来像蛮力一样。 int数组是9x9网格。 “index”指定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,因为它只是数组管理。