Tôi đang nghiên cứu đoạn mã này khi xoay một ma trận NxN; Tôi đã truy tìm chương trình vô số lần, và tôi hiểu cách xoay vòng thực sự xảy ra. Về cơ bản nó xoay các góc đầu tiên và các phần tử sau các góc theo chiều kim đồng hồ. Tôi chỉ không hiểu một vài dòng, và mã vẫn không phải là "lái xe về nhà" trong bộ não của tôi, vì vậy để nói chuyện. Hãy giúp tôi. Tôi xoay nó 90 độ, cho một ma trận 4x4 như ví dụ truy tìm của tôi.Xoay một mảng hai chiều 90 độ
[1][2][3][4]
[5][6][7][8]
[9][0][1][2]
[3][4][5][6]
trở thành
[3][9][5][1]
[4][0][6][2]
[5][1][7][3]
[6][2][8][4]
public static void rotate(int[][] matrix, int n){
for(int layer=0; layer < n/2; ++layer) {
int first=layer; //It moves from the outside in.
int last=n-1-layer; //<--This I do not understand
for(int i=first; i<last;++i){
int offset=i-first; //<--A bit confusing for me
//save the top left of the matrix
int top = matrix[first][i];
//shift left to top;
matrix[first][i]=matrix[last-offset][first];
/*I understand that it needs
last-offset so that it will go up the column in the matrix,
and first signifies it's in the first column*/
//shift bottom to left
matrix[last-offset][first]=matrix[last][last-offset];
/*I understand that it needs
last-offset so that the number decreases and it may go up the column (first
last-offset) and left (latter). */
//shift right to bottom
matrix[last][last-offset]=matrix[i][last];
/*I understand that it i so that in the next iteration, it moves down
the column*/
//rightmost top corner
matrix[i][last]=top;
}
}
}
Tôi đồng ý rằng nó là một phương pháp dễ dàng hơn, nhưng nó sẽ không được kém hiệu quả hơn cho các ma trận nhỏ? Transposing ma trận di chuyển các phần tử vào hàng chính xác, nhưng cột sai, yêu cầu sửa lỗi sau. Thuật toán của OP di chuyển các phần tử đến hàng và cột chính xác trên lần đầu tiên (tổng số bài tập ít hơn). Tôi bỏ qua địa phương trong so sánh này vì nó không phải là một vấn đề đối với ma trận nhỏ. Đối với các ma trận lớn, chúng tôi có thể muốn thay đổi thứ tự của các bài tập trong thuật toán của OP và tối ưu hóa chuyển vị trong thuật toán này. –
@Nathan: Cả hai phương thức đều thực hiện cùng một số lượng bộ nhớ và các bài tập nhớ (nhớ tạm thời trao đổi sẽ thường là một thanh ghi, cũng như 'top' trong mã OP). Điều này là đơn giản và dễ đọc, và có lẽ hiệu quả hơn so với đề xuất mà không giải quyết dữ liệu liên tục. –