Votre logique est trop compliquée.
Disons que la hauteur est 5. Pensez à deux triangle comme celui-ci, puis se chevaucher et utiliser uniquement là où ils se chevauchent:
* ***** *
** **** **
*** *** ***
**** ** **
***** * *
Si la première ligne est la ligne 0, puis nombre de places dans le premier triangle est row + 1
et le nombre de carrés dans le deuxième triangle est height - row
. Pour le recouvrement, le nombre de places est le plus faible des deux, à savoir
Math.min(row + 1, height - row)
Vous pouvez maintenant faire votre logique pour le côté gauche dans une seule boucle.
Pour illustrer, ce MCVE code affiche les coordonnées à la couleur noire:
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();
}
Sortie
(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)
Maintenant, le côté droit est le même, sauf en miroir, et peut être facilement ajouté au code, pour faire les deux côtés en même temps:
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();
}
Sortie
(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)
Si la grille peut être mince, c.-à-width < height
, alors vous devez ajouter quelques contrôles:
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();
}
Sortie
(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)
Vous avez oublié de réinitialiser 'counter' entre les deux boucles externes. – Andreas
En outre, pourquoi le nombre de carrés noirs dans une rangée pour le triangle inférieur gauche a-t-il quelque chose à voir avec la * largeur * de la grille? – Andreas