0

所以,我两天前问了一个问题,我将尝试对其进行修改以使其更简单:

我有一个二维数组,它代表一个数独游戏。

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

行、列或 3x3 正方形内没有数字 (1-9) 重复。没有空单元格。

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

我对 Java 很陌生,所以我的知识有限。我打算尝试一个很长的 if,else 语句来比较所有单元格。那没有用,因为 -1 被重复了。(-1 代表一个空的正方形)。我试图解决这个问题,但意识到这个 if 语句太混乱了,必须有更好的方法。

然后我想使用布尔语句来测试每个数字,如果以前见过,则设置为 true。这么多布尔语句似乎很混乱。

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

4

4 回答 4

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

如果 rowrowNumber在由 指定的二维数组中有重复的数字,这将返回 true,否则返回sudokuArrayfalse。请注意sudokuArray != -1, 考虑到您提到的空方块的 -1 占位符。

当你编译这样的东西时,如果编译器在尝试将整数放入数组列表时出错,你可能必须通过指定ArrayList<Integer>. 我不记得当您指定 Object 类型的目标时,Java 是否会为您自动装箱原语。

这会引出一个小的副课,因为您是新手,这可能对您有益:Java 既有原始类型(布尔、字节、短、整数、长、浮点、双精度)和原始类型的对象版本(布尔、字节、整数等)。如果你这样做int i = 0;Integer i2 = i;Java 会很好地为你做转换。

checkColumn会非常相似。check3X3area(或任何你想叫它的名字)可能有点相似;也许您可以使用 2 个 for 循环,一个嵌套在另一个中,每个循环 3 次而不是 9 次。这将留给您作为练习。

此外,您可以将此通用化,以允许尺寸不是 9 的数独板进行一些修改。

于 2012-10-16T23:59:53.940 回答
0

对于每个组(行、列或 3x3 正方形):设置 sum = 0,并且对于遇到的每个值 n 不是 -1,设置 sum = sum | 2^n。完成后,如果 sum 不是 2^10 - 2,则该组有重复项。(显然,如果你遇到 -1,你就没有赢家)。(如果您查看二进制值,您会看到发生了什么。)

于 2012-10-17T00:01:28.350 回答
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;
       }
     }
于 2012-10-17T00:04:08.893 回答
0

这看起来像,homework但我会尝试提供一些建议。

考虑一个class Sudoku是整个棋盘的。这个板子是做的81 cells。第一个约束是任何单元格都可以包含一个介于1and9和一个特殊值之间的数字,0以表示它没有被填充。这个约束很容易验证。

现在,该板有不同的预测

  • 9 rows9 column。对这些行和列的约束是 nu 号可以重复,它们都不能0。你如何验证这个约束是否满足?一种方法是创建一个 数组9 booleans,每个数组都表示是否可以看到该索引处的数字。以全部 false 开始,迭代行或列,将单元格中每个数字的索引值设置为 true。最后,如果后一个数组仅包含,true则满足约束。

  • 另一个投影是九个苏亚雷斯。同样,同样的约束也适用。

这些行、列和正方形需要知道它们的单元格在板上的位置。你应该能够实现它。例如,第 7 行将由cell[6,0]through组成cell[6,8]

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

于 2012-10-17T00:06:45.120 回答