Ihre Logik ist übermäßig kompliziert.
Sagen wir Höhe 5. Denken Sie an zwei Dreieck so ist, überlappen sie dann und nur verwenden, wenn sie sich überlappen:
* ***** *
** **** **
*** *** ***
**** ** **
***** * *
Wenn die erste Zeile Zeile 0 ist, dann Anzahl von Plätzen in der ersten Dreieck ist row + 1
und die Anzahl der Quadrate im zweiten Dreieck ist height - row
. Für die Überlappung, die Anzahl der Plätze ist die untere der beiden, das heißt
Math.min(row + 1, height - row)
Sie können jetzt Ihre Logik für die linke Seite in einer einzigen Schleife.
Zur Veranschaulichung dieses MCVE Code druckt die Koordinaten schwarz zu färben:
int height = 9;
for (int row = 0; row < height; row++) {
int cols = Math.min(row + 1, height - row);
for (int col = 0; col < cols; col++) {
System.out.printf("(%d,%d) ", col, row);
}
System.out.println();
}
Ausgabe
(0,0)
(0,1) (1,1)
(0,2) (1,2) (2,2)
(0,3) (1,3) (2,3) (3,3)
(0,4) (1,4) (2,4) (3,4) (4,4)
(0,5) (1,5) (2,5) (3,5)
(0,6) (1,6) (2,6)
(0,7) (1,7)
(0,8)
Jetzt ist die rechte Seite gleich, außer gespiegelt ist, und kann leicht sein hinzugefügt, um beide Seiten gleichzeitig zu tun:
int height = 9, width = 15;
for (int row = 0; row < height; row++) {
int cols = Math.min(row + 1, height - row);
for (int col = 0; col < cols; col++) {
System.out.printf("(%d,%d) ", col, row);
System.out.printf("(%d,%d) ", width - col - 1, row);
}
System.out.println();
}
Ausgabe
(0,0) (14,0)
(0,1) (14,1) (1,1) (13,1)
(0,2) (14,2) (1,2) (13,2) (2,2) (12,2)
(0,3) (14,3) (1,3) (13,3) (2,3) (12,3) (3,3) (11,3)
(0,4) (14,4) (1,4) (13,4) (2,4) (12,4) (3,4) (11,4) (4,4) (10,4)
(0,5) (14,5) (1,5) (13,5) (2,5) (12,5) (3,5) (11,5)
(0,6) (14,6) (1,6) (13,6) (2,6) (12,6)
(0,7) (14,7) (1,7) (13,7)
(0,8) (14,8)
Wenn das Raster schlank sein kann, das heißt width < height
, dann müssen Sie einige Prüfungen hinzu:
int height = 9, width = 5;
for (int row = 0; row < height; row++) {
int cols = Math.min(row + 1, height - row);
for (int col = 0; col < cols; col++) {
int col2 = width - col - 1;
if (col <= col2)
System.out.printf("(%d,%d) ", col, row);
if (col2 > col)
System.out.printf("(%d,%d) ", col2, row);
}
System.out.println();
}
Ausgabe
(0,0) (4,0)
(0,1) (4,1) (1,1) (3,1)
(0,2) (4,2) (1,2) (3,2) (2,2)
(0,3) (4,3) (1,3) (3,3) (2,3)
(0,4) (4,4) (1,4) (3,4) (2,4)
(0,5) (4,5) (1,5) (3,5) (2,5)
(0,6) (4,6) (1,6) (3,6) (2,6)
(0,7) (4,7) (1,7) (3,7)
(0,8) (4,8)
Sie haben vergessen zu zurücksetzen "counter" zwischen den beiden äußeren Schleifen. – Andreas
Warum hat die Anzahl der schwarzen Quadrate in einer Reihe für das untere linke Dreieck auch etwas mit der * Breite * des Gitters zu tun? – Andreas