Ruota una matrice sul posto, spostando gli elementi? (Come scrivere una parte di flusso / logica dopo aver compreso il problema?)

-2

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.

link

    
posta Stacky 09.10.2016 - 04:18
fonte

1 risposta

0

What do/did you do when stuck like this?

Usa carta e matita e disegna alcune immagini per aiutare a visualizzare il problema.

Se hai un IDE con un debugger (e se no, perché no?) allora usare il debugger in "single step" attraverso il problema può essere di aiuto.

In definitiva, questo si riduce a fare un accurato modello mentale di come funziona il codice. Non è qualcosa che qualcuno può insegnarti a fare. Devi solo esercitarti a farlo fino a quando non ne prendi il controllo. Inizia con problemi / programmi più semplici, quindi passa a quelli più complessi.

    
risposta data 09.10.2016 - 09:16
fonte

Leggi altre domande sui tag