0

这个程序的作用:

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

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

这个谜题的数字保存在一个 9x9 的数组中。

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

4

3 回答 3

0

大约 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 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,考虑到它只是数组管理。

于 2014-07-07T08:45:01.853 回答
0

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

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

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

于 2012-10-19T06:24:26.803 回答
0

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

于 2012-10-19T06:20:25.837 回答