반응형



25

10

11

12

13

23

9

2

3

14

23

8

1

4

15

22

7

6

5

16

21

20

19

18

17

  

  다음과 같이 n*n 배열의 달팽이 순열을 작성하는 알고리즘은 다음과 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <stdio.h>
 
int a[1001][1001]; // 이 달팽이 수열 코드는 0,0을 시작으로 생각하는 것이 아닌 
                   // x=1, y=1을 출발로 삼고있다. 
 
int main()
{
 int n,i,x,y;
 int buho,value,tmp,cnt,check;
 scanf("%d",&n);
 
 x = n/2 + 1; y = n/2 + 2;/*아래 for문이 y-1부터이기 때문에 +2로 지정하였다.*/ 
 i = 1; cnt = 1; buho = -1; value = 1, check = 0;
 
 while(i<=n*n)
 {
  if(cnt == 1// 위쪽 방향으로 이동 시 
  {
          
   tmp = y + (buho*value); 
   
   for(y = y-1; y >= tmp; y--)
   {
    if(i > n*n) break;
             
    a[y][x] = i; // 좌표에 해당하는 배열에 값을 대입한다. 
    i++;     // 달팽이 수열 값 증가 시킨다. 
    //printf("(%d %d) : %d\n",y,x,a[y][x]); 
   }
  
   buho = -1*buho; // 다음 차례는 오른쪽으로(x++)가는 수열이기에 
                   // 부호를 (+)로 변경시킨다. 
   cnt++// cnt는 수열 방향 판단에 이용된다. 
   
   if(check == 1// 처음에만 안돌도록 
   {y++;}// for문 탈출시 y--이 한번 더 돌기때문에 
         // y++를 한번 해준다.(좌표 이탈 방지) 
  }       
    
  
  else if(cnt == 2// 오른쪽 방향으로 이동 시 
  {
   tmp = x + (buho*value);       
   
   if(check == 1// 이 값을 지정하지 않으면 2 자리에 3이 입력된다. 
    {x++;}
   
   for(x = x; x <= tmp; x++// x+1
   {
    if(i > n*n) break;    
    
    a[y][x] = i;
    i++;     
    //printf("(%d %d) : %d\n",y,x,a[y][x]); 
   }
  
   value++// value는 수열의 꼬리 길이를 결정시켜준다. 
   cnt++;
   x--;
   
   check = 1// 처음 증감 값들 (cnt 1, 2에서 수정 위해 이용) 
  }   
  
    
  else if(cnt == 3)
  {
 
      
   tmp = y + (buho*value);      
   
   for(y = y+1; y <= tmp; y++// y+1
   {
    if(i > n*n) break;
            
    a[y][x] = i;
    i++;     
    //printf("(%d %d) : %d\n",y,x,a[y][x]);  
   }
  
   buho = -1*buho;
   cnt++;
   y--;
  }   
  
  else if(cnt == 4)
  {
  
   tmp = x + (buho*value);      
   
   for(x = x-1; x >= tmp; x--// x-1
   {
    if(i > n*n) break
             
    a[y][x] = i;
    i++;    
    //printf("(%d %d) : %d\n",y,x,a[y][x]);   
   }
  
   value++;
   cnt = 1;
   x++
  }    
            
 } //while
 
 
  for(y=1; y<=n; y++)
 {
  for(x=1; x<=n; x++)
  {
    printf("%d ",a[y][x]);
    }   
printf("\n");
 }
 
 return 0
 
//int main
 
Crocus






숏코딩 - 

( 이런 것이 있다는 것만 알아두기 )



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
i;
main(n,t,j,x,y)
{
 for(scanf("%d",&n);i<n;i++)
 {
   for(j=0;j<n;j++)
   {
    printf("%d ",t=(i+j<n?j-i:i-j+1)+pow(i+j<n?n-2*(i<j?i+1:j):1-n+2*(i<j?j:i),2));
   
   }
   puts("");
 }
 getch();  
}
 
Crocus


반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

특수 알고리즘 해결문서  (0) 2015.12.06
1~n까지의 합  (2) 2015.12.01
더하기 사이클  (0) 2015.12.01
별 찍기  (0) 2015.11.26
발산하는 점의 개수 알고리즘  (0) 2015.11.24