2017-02-23 2 views
2

6x6 1d 배열을 인쇄했지만 왼쪽 상단의 3x3 섹션을 반 시계 방향으로 회전하고 싶습니다. 이 알고리즘이 있나요? 앞으로도 오른쪽 하단 3x3 섹션이나 오른쪽 상단 3x3 섹션 또는 하단 왼쪽 3x3 섹션처럼 회전하고 싶습니다.C에서 1d 배열의 섹션을 회전하는 방법은 무엇입니까?

a[0] a[1] a[2] a[3] a[4] a[5]   a[1] a[2] a[8] a[3] a[4] a[5] 
a[6] a[7] a[8] a[9] a[10] a[11]  a[0] a[7] a[14] a[9] a[10] a[11] 
a[12] a[13] a[14] a[15] a[16] a[17] ---> a[6] a[12] a[13] a[18] a[19] a[20] 
a[18] a[19] a[20] a[21] a[22] a[23]  a[18] a[19] a[20] a[21] a[22] a[23] 
a[24] a[25] a[26] a[27] a[28] a[29]  a[24] a[25] a[26] a[27] a[28] a[29] 
a[30] a[31] a[32] a[33] a[34] a[35]  a[30] a[31] a[32] a[33] a[34] a[35] 
+1

중간 항목이 이동하지 않기 때문에 3x3은 특별한 경우입니다. 4x4 사건에서 일어날 일을 우리에게 보여줄 수 있습니까? –

+1

왼쪽 상단의 3x3 행렬 인 경우에만 수행 할 수 있습니까? 그렇지 않으면 좋은 첫 걸음이 될 수 있으며이를 수행하는 방법을 배우는 가장 좋은 방법은 종이에서하는 것입니다. 논문 작업을 할 때 4x4 행렬을 가지고, 그 작은 행렬로 왼쪽 상단 3x3 부분에 "회전"을하십시오. 4x4 행렬로 할 수 있다면 MxN 행렬 (M> 3 및 N> 3)에 적용 할 수 있어야합니다. 당신이 종이에 그것을 할 수있을 때 간단하고 작은 이산 단계에 산법을 세련하는 것을 시도하십시오. 마지막으로 이러한 작은 단계를 코드로 변환합니다. –

+0

사전 회전 인덱스와 사후 회전 인덱스 사이의 9 가지 차이점의 배열을 반올림 계산할 수 있습니다 : diff [] = {0-1,1-2,2-8,6-0,7-7, .. }}. 회전 할 하위 배열을 선택했으면 해당 하위 배열의 인덱스 배열을 가져옵니다 (예 : 하위 배열에 대해'ix [] = {'8,'9,1024252630,31,32} 왼쪽 코너)와 각각의'k '에 대해'a [k + diff [k]]'로'a [k]'를 교환합니다. _somehow_ 부분은 솔루션이 아니라 원시 아이디어 일 뿐이라는 것을 의미합니다. – DyZ

답변

1

여기에 상황이 메모리에 할당되는 방식과이를 나타내는 방식을 구별하는 것이 중요합니다. 1D 배열에는 행과 열이 없으므로 "6x6 1D 배열"과 같은 것은 없습니다. 따라서이 1D 배열을 2D 배열 6x6으로 변환하여 시작하십시오.

그런 다음 좌표 (x, y)를 지정하여 회전 중심을 정의 할 수 있습니다. 이러한 좌표가 행렬의 가장자리에 있지 않도록 위도를 점검해야합니다 (또는 필요한 경우 알고리즘이 가능하도록 디자인하십시오). 그래서

array[center_x-1][center_y-1] = array[center_x][center_y-1]; 
... 

과 :


무딘 용액은 중심 주위 인덱스를 잡고 하드 코딩 방식 주위로 데이터를 이동하는 것이다. 이것은 가장 빠른 방법 일 것이고 가장 간단한 해결책이 가장 좋습니다.


회전해야 중심 주위의 데이터를 가리키는 포인터 배열을 생성하는 것 회전 방향 변수를 허용하는 더 많은 모듈 접근. 포인터의이 배열은 연결리스트의 간단한 형태로 구현 될 수있다

typedef struct rotate_node_t rotate_node_t; 
typedef struct rotate_node_t 
{ 
    rotate_node_t* next; 
    rotate_node_t* prev; 
    int* data; 
} rotate_node_t; 

당신은 그것의 지수로 할당 할 수있는 rotate_node_t rotation [8]이있을 것이다 : "c"를 중심

0 1 2 
7 c 3 
6 5 4 

입니다.

이것을 사용하면 어떤 방향 으로든 연결된 목록을 반복하면서 한 노드에서 다른 노드로 데이터를 이동할 수 있습니다. 직접 어레이 액세스보다 유연성이 있지만 느리고 복잡합니다. 또한 모든 유형의 야생 회전 패턴을 지원하도록 확장 될 수 있습니다.