2009-07-27 7 views
1

Dies ist ein Schulproblem, ich arbeite für eine Intro-Java-Klasse. Die Aufgabe besteht darin, ein Programm zu schreiben, das eine 8 x 8-Matrix von zufällig generierten Binärzahlen erzeugt und die Programmüberprüfung hat, ob Spalten alle 0 sind und ob die Haupt- und Nebendiagonalen auch aus Nullen bestehen. Eine Hauptdiagonale ist die Diagonale, die von der oberen linken Ecke zur unteren rechten Ecke gebildet wird (dh arrayName[0][0] bis arrayName[8][8] in diesem Fall) und eine Nebendiagonale ist eine, die von der oberen rechten Ecke zur unteren linken Ecke der Matrix geht.Finden, ob die Haupt- und Nebendiagonalen des 2D-Arrays aus 0s bestehen

Ich habe alles funktioniert außer für den Teil, der für die Haupt- und Nebendiagonalen überprüft, und ich kann nicht herausfinden, warum das nicht funktioniert. Was ich versucht habe, ist einfach die Anzahl der Nullen entlang der Diagonalen zu zählen, und wenn diese Zahl 8 ist, dann hast du eine Diagonale, die aus Nullen besteht. Hier sind die beiden Verfahren, die ich für den Haupt- und Neben Array:

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

Ein interessanter Fehler, die ich auf, wenn ich versuchte, die große Diagonale zu finden, indem für die Schleife in dem Aufwärtszählen, das heißt:

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

Der Code würde nicht funktionieren, aber wenn die Diagonale alle 1 und eine einzige 0 hätte, würde es "Alle Nullen auf der Hauptdiagonale" drucken, obwohl die Variable count nicht acht war.

Hoffe das macht Sinn, danke für jede Hilfe.

Antwort

0

Ihre diagonalen Elemente sind in board[0][0], board[1][1], board[2][2], so dass keine zwei Schleifen erforderlich sind. Es ist nur 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"); 
} 

Und das Minor ist ähnlich. board[0][7], board[1][6], board[2][5], die wir zu board[i][board.length-1-i] vereinfachen können.

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

Alles gut, obwohl es wahrscheinlich lohnenswert ist, 'length' anstelle von literal' 8' in der letzten Prüfung zu verwenden (da Sie es in der Schleife verwenden), um dies etwas generischer zu machen. –

+0

Guter Punkt, ich kopierte einfach die Druckzeile von der ursprünglichen Frage. –

+0

Vielen Dank für die Einzelheiten. Ich schulde euch einen. – maxvcore

7

Sie verkomplizieren Dinge. Berücksichtigen Sie für einen Moment die Positionen der Elemente, die Sie überprüfen müssen. Für eine Hauptdiagonale sind die Indizes: (0,0), (1,1), (2,2), ..., (7,7). Jetzt pausiere, beobachte das Muster der Änderungen und denke: Wie viele Schleifen brauchst du eigentlich, um eine solche Sequenz zu erzeugen? Kleine Diagonale ist nur oberflächlich anders: (0,7), (1,6), (2,5), ..., (7,0) - was wie folgt umgeschrieben werden kann: (7-7, 7), (7-6, 6), (7-5, 5), ... (7-0, 0). Denken Sie wieder darüber nach, wie viele Schleifen Sie tatsächlich benötigen.

+0

Spot on: Wenn Sie nicht zwei separate Funktionen benötigen, sollten Sie all dies zu einer einzigen Schleife kombinieren. – DisgruntledGoat

+0

Danke, ich glaube, ich bin einfach stecken geblieben und dachte roboterhaft. – maxvcore