0

それで、私は2日前に質問をしました、私はそれをより簡単にするためにそれを作り直そうとします:

数独ゲームを表す2D配列があります。

典型的な数独ゲームと同じように、ゲームのエラーをチェックしようとしています。

行、列、または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;
}

rowNumberこれは、行に、で指定された2D配列で番号が繰り返される場合はtrueを返しsudokuArray、それ以外の場合はfalseを返します。に注意しsudokuArray != -1てください。これは、言及した空の正方形の-1プレースホルダーを考慮に入れています。

このようなものをコンパイルするときに、整数を配列リストに入れようとしてコンパイラーがエラーを起こした場合は、を指定して整数にする必要があるかもしれませんArrayList<Integer>。Object型の宛先を指定したときに、Javaがプリミティブを自動ボックス化するかどうかは思い出せません。

これは、あなたが新しいのであなたにとって有益かもしれない小さなサイドレッスンにつながります:Javaにはプリミティブ型(ブール、バイト、ショート、int、ロング、フロート、ダブル)とプリミティブ型のオブジェクトバージョン(ブール、バイト、整数など)。あなたがそうするならint i = 0;Integer i2 = i;Javaはあなたのために変換をするのに十分素晴らしいでしょう。

checkColumn非常に似ています。check3X3area(またはあなたがそれを呼びたいと思うものは何でも)いくぶん似ているかもしれません。おそらく、2つのforループを使用して、一方を他方の中にネストし、9回ではなくそれぞれ3回ループすることができます。これは演習として残しておきます。

また、いくつかの変更を加えて、サイズ9ではない数独ボードを可能にするためにこれを汎用にすることができます。

于 2012-10-16T23:59:53.940 に答える
0

各グループ(行、列、または3x3の正方形)の場合:合計= 0に設定し、値nが-1でない場合は、合計=合計|を設定します。2^n。完了したら、合計が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ボード全体であるaを考えてみましょう。このボードはで構成されてい81 cellsます。最初の制約は、セルにとの間の数値1と、セルが入力されていないことを示す9特別な値0を含めることができることです。制約は簡単に確認できます。

現在、このボードにはさまざまな予測があります。

  • あり9 rowsます9 column。これらの行と列には、nu番号を繰り返すことができ、いずれも繰り返すことができないという制約があります0。この制約が満たされていることをどのように確認しますか?1つの方法は、の配列を作成することです9 booleans。各配列は、そのインデックスの数値が表示されるかどうかを示します。すべてfalseから始めて、行または列を繰り返し、セル内の各数値のインデックスの値をtrueに設定します。最後に、この後者の配列にのみが含まれている場合true、制約が満たされます。

  • もう1つの予測は、9つのスアレスです。繰り返しますが、同じ制約が適用されます。

これらの行、列、および正方形は、それらのセルがボード上のどこにあるかを知る必要があります。あなたはそれを実装することができるはずです。たとえば、行7はcell[6,0]〜で構成されcell[6,8]ます。

すべての移動後、制約を確認します。すべてのセル、行、列、および正方形について制約が満たされている場合、ゲームは完了です。

于 2012-10-17T00:06:45.120 に答える