首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java :数独游戏:检查3x3网格的重复值

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

Stack Overflow用户
提问于 2012-10-19 14:11:10
回答 3查看 3.6K关注 0票数 0

这个程序的作用是:

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

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

这个拼图的数字保存在一个9x9数组中。

简单地说:对于如何检查数组中每个3x3部分的重复值,有什么建议吗?

EN

回答 3

Stack Overflow用户

发布于 2012-10-19 14:20:26

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

票数 0
EN

Stack Overflow用户

发布于 2012-10-19 14:24:27

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2014-07-07 16:45:02

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

代码语言:javascript
复制
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;
}   

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

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

代码语言:javascript
复制
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仅仅是数组管理,同样的概念也可以应用于Java。

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

https://stackoverflow.com/questions/12968336

复制
相关文章

相似问题

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