배열 조작 연습 중 소품이 2 차원 배열을 90도 회전시키는 것이 자주 발생합니다. 다양한 프로그래밍 언어로이를 수행하는 방법에 대한 답변이있는 몇 가지 게시물이 있습니다. 내 질문은 거기에있는 답변 중 하나를 명확히하고 유기적 인 방식으로 대답을 얻기 위해 어떤 종류의 사고 과정이 필요한지 탐구하는 것입니다.2 차원 배열을 90도 회전
다음과 같이 내가 찾은이 문제에 대한 해결책은 간다 :
public static void rotate(int[][] matrix,int n)
{
for(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;
int top = matrix[first][i];
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;
}
}
}
나는 약간 위의 코드가 시도 무슨 생각으로 가지고, 그것은 네 가지를 수행하여 사지/코너를 교환한다 일부 셀 오프셋으로 구분 된 다른 셀에 대해 동일한 작업을 수행합니다.
이 코드를 실행하면 작동한다는 것을 알 수 있습니다. 위의 주어진 알고리즘에 대한 수학적 근거는 얻을 수 없습니다. '층', '처음', '마지막'및 오프셋의 이유는 무엇입니까?
어떻게 '마지막'이 n-1-layer
이 되었습니까? 오프셋은 왜 i-first
입니까? 처음에는 오프셋이 무엇입니까?
누군가가이 알고리즘의 기원을 설명하고 해결책을 생각해 내기 위해 생각 프로세스를 단계적으로 수행 할 수 있다면 큰 도움이 될 것입니다.
감사
그냥 디버거에서 실행하거나 중간 결과를 출력하십시오 ... –