Un modo semplice di trasporre in posizione è quello di ruotare ciascun elemento in posizione a partire dal retro della matrice. Hai solo bisogno di ruotare un singolo elemento al suo posto in un momento, così per l'esempio, a partire da [0,1,2,3,4,5,6,7,8,9,a,b]
, si ottiene: (. Questo dimostra gli elementi ruotati nella loro posizione finale su ogni passo)
0,1,2,3,4,5,6,7,8,9,a,b, // step 0
,b, // step 1
,8,9,a,7, // step 2
4,5,6,8,9,a,3, // step 3
,a, // step 4
,8,9,6, // step 5
,4,5,8,9,2, // step 6
,9, // step 7
,8,5, // step 8
,4,8,1, // step 9
,8, // step 10
,4, // step 11
0, // step 12
Se si scrive il numero di elementi da ruotare per ciascun elemento (dal retro al fronte), si ottiene una buona progressione. Per l'esempio (width= 4
, height= 3
):
1,4,7,1,3,5,1,2,3,1,1,1
Oppure, in modo leggermente migliore strutturato:
1,4,7,
1,3,5,
1,2,3,
1,1,1
Rotazioni 1 elemento sono effettivamente presenti gabbie, ma la progressione porta ad una molto semplice algoritmo (in C++):
void transpose(int *matrix, int width, int height)
{
int count= width*height;
for (int x= 0; x<width; ++x)
{
int count_adjustment= width - x - 1;
for (int y= 0, step= 1; y<height; ++y, step+= count_adjustment)
{
int last= count - (y+x*height);
int first= last - step;
std::rotate(matrix + first, matrix + first + 1, matrix + last);
}
}
}
Conoscete l'altezza e la larghezza della funzione? In caso contrario, ci sono molti modi per visualizzarlo come un rettangolo. –
I modi "ragionevolmente semplici" per farlo utilizzano comunque l'ausilio O (M * N), anche se scambiano le cose sul posto. – harold
Sì, conosco l'altezza e la larghezza prima della mano. –