IT/프로그래밍
C언어 snail NxN 버전
NineKY
2007. 7. 6. 15:37
#include <stdio.h>
#define ARR_ROW 30
#define ARR_COL 30
#define ARR_INIT 65535
void printArr(int arr[][ARR_COL]); // 배열의 내용을 출력하는 함수
void snail(int arr[][ARR_COL]); // snail 함수
int main()
{
int array[ARR_ROW][ARR_COL] = {0};
snail (array);
printArr(array);
return 0;
}
void printArr(int arr[][ARR_COL])
{
int i = 0, j = 0;
for(i = 0; i < ARR_ROW; i++)
{
for(j = 0 ; j < ARR_COL; j++) printf("%3d ", arr[i][j]);
printf("\n");
}
}
void snail(int arr[][ARR_COL])
{
int i = 0, j = 0; // 반복문에서의 인덱스
int cur_x = 0, cur_y = 0; // 현재의 배열 위치
/* 값의 진행 방향에 대한 정보
* dir[0] 상(아래->위)
* dir[1] 하(위->아래)
* dir[2] 좌(우->좌)
* dir[3] 우(좌->우) */
int dir[4] = {0,0,0,1}; // 초기 진행 방향은 좌->우
// 파라메터로 넘어온 배열 초기화 := 모든 값은 ARR_INIT로 세팅
for(i = 0; i < ARR_ROW; i++)
for(j = 0; j < ARR_COL; j++) arr[i][j] = ARR_INIT;
// 배열에 값을 입력하는 부분
for(i = 1; i <= ARR_ROW*ARR_COL; i++)
{
// i값을 배열의 현재 위치에 삽입, i값은 1~25의 값에 해당
arr[cur_x][cur_y] = i;
// 현재가, 아래에서 위로 진행하고 있는 경우
if(dir[0] == 1)
{
/* 방향 전이가 이루어지는 경우 확인
* cur_x-1 < 0 : 다음 증가 위치가 배열 범위에서 벗어났는지 확인
* arr[cur_x-1][cur_y] <= i : 이미 지나쳐온 부분인지 확인 */
if(cur_x-1 < 0 || arr[cur_x-1][cur_y] <= i)
{
dir[0] = 0;
dir[3] = 1;
cur_y++;
}
// 계속 진행
else
cur_x--;
}
else if(dir[1] == 1)
{
// 방향 전이가 이루어지는 경우
if(cur_x+1 >= ARR_COL || arr[cur_x+1][cur_y] <= i)
{
dir[1] = 0;
dir[2] = 1;
cur_y--;
}
// 계속 진행
else
cur_x++;
}
else if(dir[2] == 1)
{
// 방향 전이가 이루어지는 경우
if(cur_y-1 < 0 || arr[cur_x][cur_y-1] <= i)
{
dir[2] = 0;
dir[0] = 1;
cur_x--;
}
// 계속 진행
else
cur_y--;
}
else if(dir[3] == 1)
{
// 방향 전이가 이루어지는 경우
if(cur_y+1 >= ARR_COL || arr[cur_x][cur_y+1] <= i)
{
dir[3] = 0;
dir[1] = 1;
cur_x++;
}
// 계속 진행
else
cur_y++;
}
}
}
#define ARR_ROW 30
#define ARR_COL 30
#define ARR_INIT 65535
void printArr(int arr[][ARR_COL]); // 배열의 내용을 출력하는 함수
void snail(int arr[][ARR_COL]); // snail 함수
int main()
{
int array[ARR_ROW][ARR_COL] = {0};
snail (array);
printArr(array);
return 0;
}
void printArr(int arr[][ARR_COL])
{
int i = 0, j = 0;
for(i = 0; i < ARR_ROW; i++)
{
for(j = 0 ; j < ARR_COL; j++) printf("%3d ", arr[i][j]);
printf("\n");
}
}
void snail(int arr[][ARR_COL])
{
int i = 0, j = 0; // 반복문에서의 인덱스
int cur_x = 0, cur_y = 0; // 현재의 배열 위치
/* 값의 진행 방향에 대한 정보
* dir[0] 상(아래->위)
* dir[1] 하(위->아래)
* dir[2] 좌(우->좌)
* dir[3] 우(좌->우) */
int dir[4] = {0,0,0,1}; // 초기 진행 방향은 좌->우
// 파라메터로 넘어온 배열 초기화 := 모든 값은 ARR_INIT로 세팅
for(i = 0; i < ARR_ROW; i++)
for(j = 0; j < ARR_COL; j++) arr[i][j] = ARR_INIT;
// 배열에 값을 입력하는 부분
for(i = 1; i <= ARR_ROW*ARR_COL; i++)
{
// i값을 배열의 현재 위치에 삽입, i값은 1~25의 값에 해당
arr[cur_x][cur_y] = i;
// 현재가, 아래에서 위로 진행하고 있는 경우
if(dir[0] == 1)
{
/* 방향 전이가 이루어지는 경우 확인
* cur_x-1 < 0 : 다음 증가 위치가 배열 범위에서 벗어났는지 확인
* arr[cur_x-1][cur_y] <= i : 이미 지나쳐온 부분인지 확인 */
if(cur_x-1 < 0 || arr[cur_x-1][cur_y] <= i)
{
dir[0] = 0;
dir[3] = 1;
cur_y++;
}
// 계속 진행
else
cur_x--;
}
else if(dir[1] == 1)
{
// 방향 전이가 이루어지는 경우
if(cur_x+1 >= ARR_COL || arr[cur_x+1][cur_y] <= i)
{
dir[1] = 0;
dir[2] = 1;
cur_y--;
}
// 계속 진행
else
cur_x++;
}
else if(dir[2] == 1)
{
// 방향 전이가 이루어지는 경우
if(cur_y-1 < 0 || arr[cur_x][cur_y-1] <= i)
{
dir[2] = 0;
dir[0] = 1;
cur_x--;
}
// 계속 진행
else
cur_y--;
}
else if(dir[3] == 1)
{
// 방향 전이가 이루어지는 경우
if(cur_y+1 >= ARR_COL || arr[cur_x][cur_y+1] <= i)
{
dir[3] = 0;
dir[1] = 1;
cur_x++;
}
// 계속 진행
else
cur_y++;
}
}
}