2016-11-30 11 views
2

난 그냥 초보자 그리고 난 대각선 JPEG 지그재그 주문처럼 숫자로 채워진 2 차원 배열을 만드는 방법을 알아 내려고 노력 해요 : https://en.wikipedia.org/wiki/File:JPEG_ZigZag.svg지그재그 배열 C

나는 방법을 알아 냈어

r=1; 
for(z=0;z<n;z++) 
{ 
    if(z%2=0) 
    { 
     for(i=0;i<=z;i++) 
     { 
      t[z-i][i]=r; 
      ++r; 
     } 
    } 
    else 
    { 
     for(i=0;i<=z;i++) 
     { 
      t[i][z-i]=r; 
      ++r; 
     } 
    } 
} 

을 그리고 그것은 잘 작동하지만 나는 그것의 나머지를 얻는 방법을 알아낼 수 없습니다 : 왼쪽 상단 부분을 얻을.

+1

에서 [ "로제타 코드를 살펴 보자 - 지그재그 m atrix "] (https://rosettacode.org/wiki/Zig-zag_matrix). –

+0

그런 식으로 반복을 캡슐화하는 2 개의 루프를 추가로 만들 수 있고 루프를 오프셋하는 다른 루프를 만들 수 있습니다. 두 루프는 조건문에 중첩되어야하고 부모 루프의 개수는 순서대로 조건문을 선택합니다 적절한 길을 가로 지르는 것. 내 머리 꼭대기에서 내가 제안한 해결책은 알고리즘을 복잡하게 만듭니다. 월요일 아침 이후로자는 게 아니라 지난밤 홀리데이 인 익스프레스에 머물렀다는 것을 명심하십시오. – oOpSgEo

+1

@ J. Piquard 나는 그것을 보았지만 거기에 표시된 C 코드는 나에게 너무 앞선다. – Piotr

답변

0

나는 것을보고 만 표시 C 코드는 나를 위해 너무 고급이

당신은 당신이 인덱스 for 루프의 또 다른 중첩 된 세트로 일을하고 수정하는 일을 계속 할 수 :

#include <stdio.h> 

void zigZagArray(int *array, int n) { 
    int r = 1; 

    for (int z = 0; z < n; z++) { 
     if (z % 2 == 0) { 
      for (int i = 0; i <= z; i++) { 
       // array[z - i][i] = r++; 
       *((array + (z - i) * n) + i) = r++; 
      } 
     } else { 
      for (int i = 0; i <= z; i++) { 
       // array[i][z - i] = r++; 
       *((array + i * n) + z - i) = r++; 
      } 
     } 
    } 

    for (int z = 1; z < n; z++) { 
     if (z % 2 == n % 2) { 
      for (int i = 1; i <= n - z; i++) { 
       // array[z + i - 1][n - i] = r++; 
       *((array + (z + i - 1) * n) + n - i) = r++; 
      } 
     } else { 
      for (int i = 1; i <= n - z; i++) { 
       // array[n - i][z + i - 1] = r++; 
       *((array + (n - i) * n) + z + i - 1) = r++; 
      } 
     } 
    } 
} 

void printArray(int *array, int n) 
{ 
    for (int i = 0; i < n; i++) { 
     for (int j = 0; j < n; j++) { 
      printf("%2d ", *((array + i * n) + j)); 
     } 
     printf("\n"); 
    } 
} 

int main() { 

    int a[7][7]; 
    zigZagArray((int *) a, 7); 
    printArray((int *) a, 7); 

    printf("\n"); 

    int b[8][8]; 
    zigZagArray((int *) b, 8); 
    printArray((int *) b, 8); 

    printf("\n"); 

    int c[9][9]; 
    zigZagArray((int *) c, 9); 
    printArray((int *) c, 9); 

    return 0; 
} 

OUTPUT

% ./a.out 
1 2 6 7 15 16 28 
3 5 8 14 17 27 29 
4 9 13 18 26 30 39 
10 12 19 25 31 38 40 
11 20 24 32 37 41 46 
21 23 33 36 42 45 47 
22 34 35 43 44 48 49 

1 2 6 7 15 16 28 29 
3 5 8 14 17 27 30 43 
4 9 13 18 26 31 42 44 
10 12 19 25 32 41 45 54 
11 20 24 33 40 46 53 55 
21 23 34 39 47 52 56 61 
22 35 38 48 51 57 60 62 
36 37 49 50 58 59 63 64 

1 2 6 7 15 16 28 29 45 
3 5 8 14 17 27 30 44 46 
4 9 13 18 26 31 43 47 60 
10 12 19 25 32 42 48 59 61 
11 20 24 33 41 49 58 62 71 
21 23 34 40 50 57 63 70 72 
22 35 39 51 56 64 69 73 78 
36 38 52 55 65 68 74 77 79 
37 53 54 66 67 75 76 80 81 
% 
+0

나는 크기가 홀수인지 홀수인지에 따라 결과가 다르다. 그것은 큰 문제가 아니어야합니다. 감사합니다 :) – Piotr

+0

@Piotr, 수정 사항은 사소한 것으로 판명되었습니다 : 새 코드에서'if (z % 2) {'를'if (z % 2 == n % 2) {'로 변경하십시오. 코드를 업데이트하고 수정 사항을 확인하기 위해 예제 출력을 제공했습니다. 즐겨. – cdlane