2009-07-27 10 views
1

これは私がイントロJavaクラスのために取り組む学校の問題です。この割り当ては、ランダムに生成された2進数の8×8行列を生成するプログラムを作成し、もしあれば列がすべて0であり、メジャーおよびマイナーな対角線もゼロから構成されているかどうかをプログラムにチェックさせる。主対角は、左上隅から右下隅にかけて形成された対角線(すなわち、arrayName[0][0]arrayName[8][8])であり、副対角線は、行列の右上隅から左下隅に向かう斜辺である。2D配列のメジャーとマイナーな対角線が0からなるかどうかを調べる

メジャーとマイナーな対角線をチェックする部分を除いて、すべてが機能しています。なぜこれが機能しないのかわかりません。私がしようとしてきたのは、対角線に沿ったゼロの数を数えるだけです。その数が8なら、あなたは0からなる対角になります。ここではメジャーとマイナーのアレイのための私が持っている2つの方法です:

public static void majorDiagonal(int[][] board) { 
    byte count = 0; 

    for(int row = board.length - 1, offsetNumber = board.length - 1; row > 0; row--, offsetNumber--) 
     for(int column = board.length - 1; column > 0; column--) 
      if(board[row][offsetNumber] == 0) count++; 

    if(count == 8) System.out.println("All zeroes on the major diagonal"); 
} 

public static void minorDiagonal(int[][] board) { 
    byte count = 0; 

    for(int row = board.length - 1, offsetNumber = 0; row > 0; row--, offsetNumber++) 
     for(int column = board.length - 1; column > 0; column--) 
      if(board[row][offsetNumber] == 0) count++; 

    if(count == 8) System.out.println("All zeroes on the minor diagonal"); 
} 

私はforループ、すなわちにカウントアップすることにより、主要な対角線を見つけることを試みたときに私が遭遇した興味深いエラー:

for(int row = 0; row< board.length; row++) 
    for(int column = 0; column < board.length; column++) 
     if(board[row][row] == 0) count++; 

コードは機能しませんでしたが、対角線がすべて1と単一の0を持つ場合、変数countが8ではないにもかかわらず、 "すべてのゼロがメジャーダイアゴナルに"印刷されます。

これは意味があると思いますが、何か助けていただきありがとうございます。

答えて

0

あなたの対角要素はboard[0][0]board[1][1]board[2][2]であるため、2つのループは必要ありません。ただboard[i][i]です。

public static void majorDiagonal(int[][] board) 
{ 
    byte count = 0; 
    for (int i = 0; i < board.length; ++i) 
    { 
     if (board[i][i] == 0) count++; 
    } 
    if(count == board.length) System.out.println("All zeroes on the major diagonal"); 
} 

マイナーは似ています。 board[0][7]board[1][6]board[2][5]board[i][board.length-1-i]に簡略化することができます。

public static void minorDiagonal(int[][] board) 
{ 
    byte count = 0; 
    for (int i = 0; i < board.length; ++i) 
    { 
     if (board[i][board.length-1-i] == 0) count++; 
    } 
    if(count == board.length) System.out.println("All zeroes on the minor diagonal"); 
} 
+0

これは少し一般的なものにするために、最終チェックでリテラル '8'ではなく' length'を使う価値があります(ループで使用しているので)。 –

+0

良い点、私はちょうど元の質問から印刷行をコピー貼り付けました。 –

+0

ありがとうございます。私はあなたに1つ借りている。 – maxvcore

7

あなたは事を複雑にしています。あなたがチェックする必要がある要素の位置をしばらく考えてみてください。主対角線の場合、インデックスは、(0,0)、(1,1)、(2,2)、...、(7,7)である。ここで、一時停止し、変更のパターンを観察し、実際にそのようなシーケンスを生成するループがいくつあるかを考えます。 (0,7)、(1,6)、(2,5)、...、(7,0) - は次のように書き直すことができます。(7-7,7)、 7-6,6)、(7-5,5)、...(7-0,0)である。繰り返しますが、実際に必要なループの数を考慮してください。

+0

Spot on:2つの機能を別々に使用する必要がある場合を除き、このすべてを1つのループにまとめる必要があります。 – DisgruntledGoat

+0

ありがとう、私はちょうどロボット的な方法で考えて立ち往生したと思います。 – maxvcore

関連する問題