J'ai résolu quelques questions de codage pour me préparer à un entretien de codage, et j'ai trouvé une question qui m'a semblé assez déroutante. J'ai résolu la question après avoir passé un certain temps dessus ; cependant, le code semble codé en dur et n'a aucun style. Je me demandais donc si je pouvais avoir des retours sur la façon de styliser le code, ou peut-être avoir une meilleure idée de la façon d'aborder le problème.
La question vous demande essentiellement de dessiner un losange de chiffres avec un motif dans un tableau 2d. Elle donne une coordonnée de 'x' et une plage de x. À partir de x, les nombres s'étalent un par un jusqu'à la plage. Il y a donc 4 entrées différentes, N (la taille d'un tableau), X, Y (la coordonnée de 'x' comme (lignes, colonnes)), et R (intervalle).
Si on leur donnait une taille de 8, des coordonnées de (4,5) avec un intervalle de 3, le résultat serait le suivant,
0 0 0 0 3 0 0 0
0 0 0 3 2 3 0 0
0 0 3 2 1 2 3 0
0 3 2 1 x 1 2 3
0 0 3 2 1 2 3 0
0 0 0 3 2 3 0 0
0 0 0 0 3 0 0 0
0 0 0 0 0 0 0 0
Et voici ce que j'ai,
int n = sc.nextInt();
char[][] arr = new char[n][n];
int r = sc.nextInt() - 1;
int c = sc.nextInt() - 1;
int range = sc.nextInt();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = '0';
}
}
arr[r][c] = 'x';
int num = 1;
for (int i = 0; i < range; i++) {
//Cross
if (c-num > -1) {
arr[r][c - num] = (char) (num + '0');
}
if (c+num < n) {
arr[r][c + num] = (char) (num + '0');
}
if (r-num > -1) {
arr[r - num][c] = (char) (num + '0');
}
if (r+num < n) {
arr[r + num][c] = (char) (num + '0');
}
//Diagonal
if (i > 0) {
int sum = num - 1, delta = 1;
while (sum != 0) {
if (r-sum > -1 && c+delta < n) {
arr[r - sum][c + delta] = (char) (num + '0');
}
sum--;
delta++;
}
sum = num - 1; delta = 1;
while (sum != 0) {
if (r+sum < n && c-delta > -1) {
arr[r + sum][c - delta] = (char) (num + '0');
}
sum--;
delta++;
}
sum = num - 1; delta = 1;
while (sum != 0) {
if (r-sum > -1 && c-delta > -1) {
arr[r - sum][c - delta] = (char) (num + '0');
}
sum--;
delta++;
}
sum = num - 1; delta = 1;
while (sum != 0) {
if (r+sum < n && c+delta > -1) {
arr[r + sum][c + delta] = (char) (num + '0');
}
sum--;
delta++;
}
}
num++;
}
Je n'ai pas trouvé d'autre moyen de prendre en charge les nombres diagonaux que d'utiliser quatre boucles while différentes. J'apprécierais tout type de retour d'information. Merci d'avance !