반응형
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 |