这个程序的作用是:
该程序从一个类中获取值,并将这些值用作数独游戏的起始值。我们将在一个典型的数独9x9网格中打印这些内容。然后,程序提示用户在网格上给出一个坐标点和一个要放入其中的值。目前,我正在做的是确保用户输入的值是有效的,以解决这个难题。一旦填好了拼图,并且在每列、行和3x3正方形中不再有任何重复的值,游戏就应该结束,输出应该是“拼图完成”。
到目前为止,我的程序成功地检查了列和行中的重复值,但是我不知道从哪里开始检查每个3x3正方形。
这个拼图的数字保存在一个9x9数组中。
简单地说:对于如何检查数组中每个3x3部分的重复值,有什么建议吗?
发布于 2012-10-19 14:20:26
我要做的不是一个大的9x9数组,而是存储一个由3x3个数字数组组成的3x3数组。或者两者兼而有之,以便于计算(存储81字节以上的数据(我希望字段使用字节吗?)不会导致所有设备的内存问题,但大多数内存不足的设备,我怀疑你是否想在这样的设备上玩游戏)。
发布于 2012-10-19 14:24:27
这取决于你存储数独电路板的方式。如果您将其存储为2D数组,则可以让您的逻辑识别用户选择输入新值的3x3框,并使用您已有的代码来检查行和列部分。
你也可以拥有一个9套的集合。每组将对应于特定的3x3块。因此,当用户选择他/她想要添加值的位置的坐标时,您将选择给定的集合并在该集合中执行add操作。
由于集合不允许重复,因此如果集合中已存在该数字,则add方法将返回false。这还允许您识别任何重复的值(但是,与数组选项不同的是,如果用户选择从3x3网格中删除值,则还需要更新集合)。
发布于 2014-07-07 16:45:02
大约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仅仅是数组管理,同样的概念也可以应用于Java。
https://stackoverflow.com/questions/12968336
复制相似问题