比较数组中的值

时间:2012-10-16 23:48:46

标签: java sudoku

所以,我在2天前提出了一个问题,我将尝试重做它以使其更简单:

我有一个2D数组,代表一个数独游戏。

我正在尝试检查游戏中的错误,就像典型的数独游戏一样:

在行,列或3x3平方内不重复数字(1-9)。没有空单元格。

用户可以输入重复值,但在修复这些错误之前,游戏不会被视为“赢了”。我想允许他们输入错误的价值,而不是赢。

我对Java很陌生,所以我对这方面的知识有限。我打算尝试比较所有细胞的长期if,else语句。这没用,因为-1重复了。 (-1表示空方块)。我试图绕过这个,但意识到这个if语句太乱了,必须有更好的方法。

然后我想用布尔语句来测试每个数字,如果之前已经看过,则设置为true。这么多布尔语句看起来很混乱。

所以,我有点像墙。关于尝试什么的任何提示?尽量不要提前使用任何东西,只做Java 2个月。

4 个答案:

答案 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;
}

如果行rowNumbersudokuArray指定的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组成。第一个约束是任何单元格都可以包含19之间的数字以及一个特殊值0来表示它尚未填充。约束很容易验证。

现在,这个委员会有不同的投影

  • 9 rows9 column。约束在这些行和列上是nu数可以重复,并且它们都不能是0。你怎么验证这个担保是否满意?一种方法是创建一个9 booleans数组,每个数组都表示该索引处的数字是否为 see 。从所有false开始,迭代行或列,将单元格中每个数字的索引值设置为true。最后,如果后一个数组仅包含true,则会满足constaint。

  • 另一个预测是9个suares。同样,相同的constaint适用。

这些行,列和方块需要在其单元格位于板上的位置。你应该能够实现它。例如,第7行将包含cell[6,0]cell[6,8]

每次移动后,检查约束,如果它们对所有单元格,行,列和正方形都满意,则游戏完成。