Di seguito è una soluzione java della classica questione di ruotare una matrice nxn in senso orario di 90 gradi.
public void rotate(int[][] matrix, int n) {
for (int layer = 0; layer < n / 2; ++layer) {
int first = layer;
int last = n - 1 - layer;
for(int i = first; i < last; ++i) {
int offset = i - first;
// save top
int top = matrix[first][i];
// left -> top
matrix[first][i] = matrix[last-offset][first];
// bottom -> left
matrix[last-offset][first] = matrix[last][last - offset];
// right -> bottom
matrix[last][last - offset] = matrix[i][last];
// top -> right
matrix[i][last] = top;
}
}
}
Di seguito è l'approccio che sto cercando di utilizzare: 1. Comprendere la dichiarazione del problema, ipotesi. 2. Rompa il problema nelle sotto-attività più piccole e prova a scrivere / spiegare la soluzione come in inglese. 3. Scrivi pseudo codice 4. Scrivi il codice effettivo.
Mi sto bloccando tra # 3 e # 4. Ho l'approccio e conosco la logica, ma sto avendo difficoltà a scrivere una parte della soluzione. Lasciami mostrare cosa:
Approccio: Data questa matrice nxn:
[00 01 02 03
10 11 12 13
20 21 22 23
30 31 32 33]
Questa matrice può essere ruotata ruotando gli anelli interni ed esterni evidenziati (non effettivamente circolari). L'anello esterno ha *.
[00* 01* 02* 03*
10* 11 12 13*
20* 21 22 23*
30* 31* 32* 33*]
Ora, per ruotare le righe e le colonne, è possibile spostare ciascun elemento delle righe e della colonna corrispondente. Ad esempio, prima prendi 00 in una variabile temporanea. Sposta 30 al posto di 00. Muovi 33 al posto di 30. Sposta 03 al posto di 33 e infine assegna temp a 03. Similmente, sposta gli altri.
Ora, l'approccio sopra può essere implementato prendendo un contatore esterno tra 0 e meno di len / 2. Questo è chiamato come strato nella soluzione. Il contatore interno sarà tra livello e ultimo. Semplice!
Ma sto attraversando un periodo difficile nel codificare la parte in grassetto. scrivendo qui sotto per lavorare con tutti gli indici.
// save top
// left -> top
// bottom -> left
// right -> bottom
// top -> right
ecco le cose tra []: Ha dato una pausa alla domanda, ma ha continuato a commettere errori in uno di questi indici dinamici. Di solito mi trovo a mio agio in cicli annidati / normali.
matrix[first][i] = matrix[last-offset][first];
matrix[last-offset][first] = matrix[last][last - offset];
matrix[last][last - offset] = matrix[i][last];
matrix[i][last] = top;
So cosa deve essere fatto ma non posso scrivere la logica degli indici dinamici. Qualsiasi aiuto su questo sarà apprezzato. La soluzione è lì, ma questa domanda è più di un consiglio utile. Cosa fai / hai fatto quando bloccato così?
La risposta sopra è stata spiegata dall'autore, ma ha anche saltato al programma già scritto dopo aver spiegato l'approccio.