숫자 n을 입력받아 [n]X[n]배열에 바깥쪽부터 안쪽으로 오른쪽 나선형 방향으로 숫자를 입력.

#include <stdio.h>


void snail(int (*s)[50], int n);
void arrprint(int (*s)[50], int n);


int main(void)
{
      int arr[50][50];
      int val;


      printf("한 개의 정수 입력 : ");
      scanf("%d", &val);


      snail(arr, val);
      arrprint(arr, val);


      return 0;
}


void snail(int (*s)[50], int n)
{
      int i, j;
      int nb=1, i2=n-1;


      for(i=0; ; i++)
      {
            for(j=i; j<n-i; j++)
            {
                  s[i][j]=nb++;
                  if(nb>n*n)
                        return;
            }
            for(j=i+1; j<n-i; j++)
            {
                  s[j][i2]=nb++;
                  if(nb>n*n)
                        return;
            }
            for(j=i2-1; j>=i; j--)
            {
                  s[i2][j]=nb++;
                  if(nb>n*n)
                        return;
            }
            for(j=i2-1; j>i; j--)
            {
                  s[j][i]=nb++;
                  if(nb>n*n)
                        return;
            }
            i2--;
      }
}


void arrprint(int (*s)[50], int n)
{
      int i, j;


      for(i=0; i<n; i++)
      {
            for(j=0; j<n; j++)
                  printf("%5d ", s[i][j]);
            printf("\n");
      }
}


/*
megashocking님의 Hisworld.tistory.com에서 배워야 할 부분
void snail(int (*s)[100], int n)
{
      int i;
      int in_num=1;
      int x=0, y=-1, sw=1;
      //in_num은 배열에 입력될 초기값
      //x, y로 배열의 인자 위치를 좌표로 설정
      //y가 -1인 이유는 반복문에서 초기 입력 위치 y를 [0]으로 만들기 위함.


      while(n!=0){
            for(i=0 ; i<n ; i++)
            {
                  y+=sw;
                  arr[x][y]=in_num++;
            }


            n--; //가로->세로, 세로->가로 진행시 칸수가 하나씩 줄어듬.


            for(i=0 ; i<n ; i++)
            {
                  x+=sw;
                  arr[x][y]=in_num;
            }


            sw*=-1; //가로 방향이 오른쪽으로 진행되면 다음 가로방향은 왼쪽으로 진행됨.
      }
}

arrprint함수
{
      int i, j;


      for(i=0 ; i<n ; i++)
            for(j=0 ; j<n ; j++)
                 printf("%5d%s", s[i][j], (j==n-1) ? "\n" ? "\t");
                 //행의 끝에 다다르면 개행(\n) 그렇지 않으면 탭(\t)
*/

신고

+ Recent posts