所以,我在2天前提出了一个问题,我将尝试重做它以使其更简单:
我有一个2D数组,代表一个数独游戏。
我正在尝试检查游戏中的错误,就像典型的数独游戏一样:
在行,列或3x3平方内不重复数字(1-9)。没有空单元格。
用户可以输入重复值,但在修复这些错误之前,游戏不会被视为“赢了”。我想允许他们输入错误的价值,而不是赢。
我对Java很陌生,所以我对这方面的知识有限。我打算尝试比较所有细胞的长期if,else语句。这没用,因为-1重复了。 (-1表示空方块)。我试图绕过这个,但意识到这个if语句太乱了,必须有更好的方法。
然后我想用布尔语句来测试每个数字,如果之前已经看过,则设置为true。这么多布尔语句看起来很混乱。
所以,我有点像墙。关于尝试什么的任何提示?尽量不要提前使用任何东西,只做Java 2个月。
答案 0 :(得分:0)
1)您想循环遍历值,例如使用for循环。 比长if-else-if链更好
。2)为了跟踪所看到的值,一种简单的方法可能是使用列表。我会尽量保持这个例子尽可能简单,因为你要求“没有任何进展。”
public boolean checkRow(int rowNumber)
{
ArrayList numbersSeen = new ArrayList();
for(int i = 0; i < 9; i += 1)
{
if(sudokuArray[i][rowNumber] != -1 && numbersSeen.contains(sudokuArray[i][rowNumber]))
{
return true;
}
}
return false;
}
如果行rowNumber
在sudokuArray
指定的2D数组中有重复数字,则返回true,否则返回false。请注意sudokuArray != -1
,它考虑了您提到的空方块的-1占位符。
当你编译这样的东西时,如果编译器有关尝试将整数放入数组列表的错误,你可能必须通过指定ArrayList<Integer>
使其成为通用的。我不记得当你指定Object类型的目标时,Java是否会自动为你设置一个原语。
这导致了一个小课程,因为你是新手,可能对你有益:Java既有原始类型(boolean,byte,short,int,long,float,double),也有原始类型的对象版本(布尔,字节,整数等)。如果您执行int i = 0;
和Integer i2 = i;
,那么Java将非常适合为您进行转换。
checkColumn
会非常相似。 check3X3area
(或者你想要称之为的任何东西)可能有些类似;也许你可以使用2个for-loops,一个嵌套在另一个中,然后循环3次而不是9.这将留给你练习。
此外,您可以将此通用设置为允许不具有大小为9的数据板进行一些修改。
答案 1 :(得分:0)
对于每个组(行,列或3x3平方):设置sum = 0,并且对于每个遇到-1的值n,设置sum = sum | 2 ^ N。当你完成时,如果总和不是2 ^ 10 - 2,那么该组有一个副本。 (显然,如果你遇到-1,你就没有胜利者)。 (如果你看二进制的值,你会看到发生了什么。)
答案 2 :(得分:0)
算法:
int [][] numbers = new int[3][3];
int[] rowSum = new int[]{0,0,0};
int[] colSum =new int[]{0,0,0};
//validate duplicate
for(int i=0; i< 2; i++){
boolean duplicate = false;
for(int j=0; j<2; j++)
if(numbers[i][j]==numbers[i+1][j] ||
numbers[i][j]==numbers[i][j+1]){
System.out.println("duplicate");
duplicate = true;
break;
}
if(duplicate){
break;
}
}
//sum rows and columns
for(int i=0; i< 3; i++){
for(int j=0; j<3; j++){
rowSum[i] = rowSum[i] + numbers[i][j];
colSum[j] = colSum[j] + numbers[i][j];
}
}
//validate row and column sums
for(int i=0; i< 3; i++){
if((rowSum[i] != 15) || (colSum[i]!=15)){
System.out.println("incorrect sum");
break;
}
}
答案 3 :(得分:0)
这看起来像homework
,但我会尝试提供一些建议。
考虑class Sudoku
这是整个董事会。该单板由81
cells
组成。第一个约束是任何单元格都可以包含1
和9
之间的数字以及一个特殊值0
来表示它尚未填充。约束很容易验证。
现在,这个委员会有不同的投影:
有9
rows
和9
column
。约束在这些行和列上是nu数可以重复,并且它们都不能是0
。你怎么验证这个担保是否满意?一种方法是创建一个9
booleans
数组,每个数组都表示该索引处的数字是否为 see 。从所有false开始,迭代行或列,将单元格中每个数字的索引值设置为true。最后,如果后一个数组仅包含true
,则会满足constaint。
另一个预测是9个suares。同样,相同的constaint适用。
这些行,列和方块需要在其单元格位于板上的位置。你应该能够实现它。例如,第7行将包含cell[6,0]
到cell[6,8]
。
每次移动后,检查约束,如果它们对所有单元格,行,列和正方形都满意,则游戏完成。