반응형

달팽이 배열 출력하기 

 

글. 다산영재학원 오상문 sualchi@daum.net 

 

/*달팽이 배열 출력하기   (오상문 sualchi@daum.net)
  정사각형 구조 2차원 배열 한쪽 크기를 입력받고  달팽이 모양으로 숫자를 배치하는 예제입니다.

[입력]
2차원 배열 크기 입력(1~28): 5

[출력]
25 24 23 22 21
10  9   8   7 20
11  2   1   6 19
12  3   4   5 18
13 14 15 16 17

 

[참고] 1, 2, 3 순서로 출력하려면
1) num 초기값을 1로 정합니다.
2) for 문에 있는 num--; 문을 num++;로 고칩니다.
3) 다시 컴파일하고 실행해서 확인합니다.
 1     2   3    4   5
16  17  18  19   6
15  24  25  20   7
14  23  22  21   8
13  12  11  10   9  */

#include <stdio.h>

 

int arr[30][30];    // 저장할 배열
int lens[60];       // 각 라운드별 진행할 개수 (0라운드부터)
int xp=-1, yp=0;   // 시작 위치(0,0에서 왼쪽으로 한칸 이전)
int direction = 0;  // 0:동, 1:남, 2:서, 3:북
int round = 0;      // 몇 라운드인지 (0 ~ (size+size-1)차)
int num;            // 출력 숫자 (max ~ 1 또는 1~ max)
int size;           // 정사각형 배열 한변 크기

 

// 현재 진행 방향에 맞게 xp, yp 값 변경
void move(int direct)
{
  switch(direct) {
  case 0: xp++;  break;
  case 1: yp++;  break;
  case 2: xp--;  break;
  case 3: yp--;  break;
  }
}

// arr 배열 정보를 출력
void print_box(int size)
{
  int x, y;
  printf("\n");
  for(y=0; y<size; y++) {
    for(x=0; x<size; x++)
      printf("%3d ", arr[y][x]);
    printf("\n");
  }
}

 

int main( )
{
  int i, j;

  // 배열 크기 입력
  do {
    printf("2차원 배열 크기 입력(1~28): ");
    scanf(" %d", &size);
  } while (size < 1 || size > 28);

  num = size*size;  // 출력에 사용할 숫자 계산

  // 라운드별 진행 개수 계산 (3이면 3, 2, 2, 1, 1, 0 )
  for(i=0, j=size; j >= 0; i+=2, j--) {
    lens[i] = j;
    lens[i+1] = j-1;
  }

  // 라운드 회차만큼 반복...
  while(round < size+size-1) {   //1,3,5,7, (nth = size+size-1)
    // 각 라운드별 출력 처리
    for(i=0; i<lens[round]; i++) {
      move(direction);        // 방향에 맞게 xp, yp 위치 변경
      arr[yp][xp] = num--;   // 새 위치에 숫자 출력하고 -1
    }
    round++;                  // 라운드 증가
    direction = (direction+1)%4; //다음 방향(0:동,1:남,2:서,3:북)
  }

  print_box(size);       // 최종 결과를 화면에  출력
  return 0;
}


 

<이상>

 

반응형

+ Recent posts