该计划的作用:
此程序从类中获取值,并将其用作数独谜题的起始值。我们将在典型的Sudoku 9x9网格中打印出来。然后程序提示用户在网格上给出一个坐标点和一个放在那里的值。目前我正在研究的是确保用户输入的值对解决这个难题有效。一旦拼图完成并且每列,行和3x3平方不再有任何重复值,游戏应该结束并且输出应该是“拼图完成”。
截至目前,我的程序已成功检查列和行中的重复值,但我不知道从哪里开始检查每个3x3方块。
此拼图的数字保存在9x9阵列中。
基本上:有关如何检查数组的每个3x3部分中重复值的任何提示吗?
答案 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,因为它只是数组管理。