Cách đơn giản để chuyển vị trí là xoay từng phần tử vào vị trí bắt đầu từ mặt sau của ma trận. Bạn chỉ cần xoay một yếu tố duy nhất vào vị trí cùng một lúc, ví dụ như vậy, bắt đầu với [0,1,2,3,4,5,6,7,8,9,a,b]
, bạn nhận được: (. Điều này chỉ cho thấy các yếu tố xoay vào vị trí cuối cùng của họ trên mỗi bước)
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
Nếu bạn viết ra có bao nhiêu phần tử để xoay cho mỗi phần tử (từ sau ra trước), nó tạo thành một tiến trình tốt đẹp. Đối với ví dụ (width= 4
, height= 3
):
1,4,7,1,3,5,1,2,3,1,1,1
Hoặc, theo một cách hơi có cấu trúc tốt hơn:
1,4,7,
1,3,5,
1,2,3,
1,1,1
Xoay của 1 phần tử là một cách hiệu quả không-ops, nhưng sự tiến triển dẫn đến một rất đơn giản thuật toán (trong 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);
}
}
}
Bạn có biết chiều cao và chiều rộng đi vào chức năng không? Nếu không, có nhiều cách để hiển thị hình ảnh này dưới dạng hình chữ nhật. –
Các cách "hợp lý đơn giản" để làm điều đó sử dụng O (M * N) phụ trợ anyway, mặc dù họ trao đổi những thứ tại chỗ. – harold
Có Tôi biết chiều cao và chiều rộng trước khi tay. –