[Algorithm/C] Zig-Zag 배열 만들기
#include <stdio.h>
typedef enum {SOUTH_WEST=0, NORTH_EAST, WEST_NORTH, EAST_SOUTH} Dir;
typedef enum {EAST=1,WEST, SOUTH, NORTH} Direction;
void show2DArray(int (*arr)[9],int size)
{
int i,j;
for(i=0; i<size; i++)
{
for(j=0; j<size; j++)
{
printf("%02d ", arr[i][j]);
}
puts(" ");
}
}
void inverse2DArray(int (*arr)[9], int size)
{
int i,j;
for(i=0; i<size; i++)
{
for(j=size-1; j>=0; j--)
{
printf("%02d ",arr[i][j]);
}
puts(" ");
}
}
void main(void)
{
int arr[9][9]={0};
int dimension,count,x,y,startIndex;
Dir dir;
Direction direction;
while(1)
{
fputs("조건 1 (Size 2이상 9이하) 입력 : ",stdout);
scanf("%d",&dimension);
if( 2 <= dimension && dimension <= 9)
{
break;
}
}
while(1)
{
fputs("시작점을 선택하시오 (Up-Left:1, Low-Left:2, Up-Right:3, Low-Right:4): ",stdout); scanf("%d",&startIndex);
if(1<=startIndex && startIndex<=8)
{
break;
}
}
while(1)
{
if(startIndex==1)
{
fputs("방향을 선택하시오 (SOUTH:3, EAST:1) : ",stdout); scanf("%d",&direction);
}
if(startIndex==2)
{
fputs("방향을 선택하시오 (NORTH:4, EAST:1) : ",stdout); scanf("%d",&direction);
}
if(startIndex==3)
{
fputs("방향을 선택하시오 (SOUTH:3, WEST:2) : ",stdout); scanf("%d",&direction);
}
if(startIndex==4)
{
fputs("방향을 선택하시오 (NORTH:4, WEST:2) : ",stdout); scanf("%d",&direction);
}
if(1<= direction && direction <=4)
{
break;
}
}
if(startIndex==1 && direction==3) //좌 상단 시작 아래로
{
for(dir=SOUTH_WEST, x=0,y=0, count=1; count <= dimension*dimension; )
{
if(dir == SOUTH_WEST)
{
for(arr[x][y]=count++; x + 1 < dimension && y - 1 >=0; x++, y--)
{
arr[x+1][y-1] = count++;
}
if(x + 1 >= dimension && y - 1 < 0)
{
y++, dir = NORTH_EAST;
}
else if(y - 1 < 0)
{
x++, dir = NORTH_EAST;
}
else if(x + 1 >= dimension)
y++, dir = NORTH_EAST;
}
else
{
for(arr[x][y]=count++; x - 1 >= 0 && y + 1 < dimension; x--,y++)
{
arr[x-1][y+1]=count++;
}
if(x - 1 < 0 && y + 1 >= dimension)
{
x++, dir = SOUTH_WEST;
}
else if (x - 1 < 0)
{
y++, dir = SOUTH_WEST;
}
else if (y + 1 >= dimension)
{
x++, dir = SOUTH_WEST;
}
}
}
}
if(startIndex==4 && direction==4) // 우 하단 시작 위로
{
for(dir=SOUTH_WEST, x=0,y=0, count=1; count <= dimension*dimension; )
{
if(dir == SOUTH_WEST)
{
for(arr[x][y]=dimension*dimension+1-count++; x + 1 < dimension && y - 1 >=0; x++, y--)
{
arr[x+1][y-1] = dimension*dimension+1-count++;
}
if(x + 1 >= dimension && y - 1 < 0)
{
y++, dir = NORTH_EAST;
}
else if(y - 1 < 0)
{
x++, dir = NORTH_EAST;
}
else if(x + 1 >= dimension)
y++, dir = NORTH_EAST;
}
else
{
for(arr[x][y]=dimension*dimension+1-count++; x - 1 >= 0 && y + 1 < dimension; x--,y++)
{
arr[x-1][y+1]=dimension*dimension+1-count++;
}
if(x - 1 < 0 && y + 1 >= dimension)
{
x++, dir = SOUTH_WEST;
}
else if (x - 1 < 0)
{
y++, dir = SOUTH_WEST;
}
else if (y + 1 >= dimension)
{
x++, dir = SOUTH_WEST;
}
}
}
}
if(startIndex==1&&direction==1) //좌 상단 시작 오른쪽으로.
{
for(dir=NORTH_EAST, x=0,y=0, count=1; count <= dimension*dimension; )
{
if(dir == SOUTH_WEST)
{
for(arr[x][y]=count++; x + 1 < dimension && y - 1 >=0; x++, y--)
{
arr[x+1][y-1] = count++;
}
if(x + 1 >= dimension && y - 1 < 0)
{
y++, dir = NORTH_EAST;
}
else if(y - 1 < 0)
{
x++, dir = NORTH_EAST;
}
else if(x + 1 >= dimension)
y++, dir = NORTH_EAST;
}
else
{
for(arr[x][y]=count++; x - 1 >= 0 && y + 1 < dimension; x--,y++)
{
arr[x-1][y+1]=count++;
}
if(x - 1 < 0 && y + 1 >= dimension)
{
x++, dir = SOUTH_WEST;
}
else if (x - 1 < 0)
{
y++, dir = SOUTH_WEST;
}
else if (y + 1 >= dimension)
{
x++, dir = SOUTH_WEST;
}
}
}
}
if(startIndex==4&&direction==2) // 우 하단 시작 왼쪽으로
{
for(dir=NORTH_EAST, x=0,y=0, count=1; count <= dimension*dimension; )
{
if(dir == SOUTH_WEST)
{
for(arr[x][y]=dimension*dimension+1-count++; x + 1 < dimension && y - 1 >=0; x++, y--)
{
arr[x+1][y-1] = dimension*dimension+1-count++;
}
if(x + 1 >= dimension && y - 1 < 0)
{
y++, dir = NORTH_EAST;
}
else if(y - 1 < 0)
{
x++, dir = NORTH_EAST;
}
else if(x + 1 >= dimension)
y++, dir = NORTH_EAST;
}
else
{
for(arr[x][y]=dimension*dimension+1-count++; x - 1 >= 0 && y + 1 < dimension; x--,y++)
{
arr[x-1][y+1]=dimension*dimension+1-count++;
}
if(x - 1 < 0 && y + 1 >= dimension)
{
x++, dir = SOUTH_WEST;
}
else if (x - 1 < 0)
{
y++, dir = SOUTH_WEST;
}
else if (y + 1 >= dimension)
{
x++, dir = SOUTH_WEST;
}
}
}
}
if(startIndex==3&&direction==3) //우 상단 시작 아래로 //좌 상단 시작 아래로 응용.
{
for(dir=SOUTH_WEST, x=0,y=0, count=1; count <= dimension*dimension; )
{
if(dir == SOUTH_WEST)
{
for(arr[x][y]=count++; x + 1 < dimension && y - 1 >=0; x++, y--)
{
arr[x+1][y-1] = count++;
}
if(x + 1 >= dimension && y - 1 < 0)
{
y++, dir = NORTH_EAST;
}
else if(y - 1 < 0)
{
x++, dir = NORTH_EAST;
}
else if(x + 1 >= dimension)
y++, dir = NORTH_EAST;
}
else
{
for(arr[x][y]=count++; x - 1 >= 0 && y + 1 < dimension; x--,y++)
{
arr[x-1][y+1]=count++;
}
if(x - 1 < 0 && y + 1 >= dimension)
{
x++, dir = SOUTH_WEST;
}
else if (x - 1 < 0)
{
y++, dir = SOUTH_WEST;
}
else if (y + 1 >= dimension)
{
x++, dir = SOUTH_WEST;
}
}
}
inverse2DArray(arr, dimension);
}
if(startIndex==2&&direction==4)
{
for(dir=SOUTH_WEST, x=0,y=0, count=1; count <= dimension*dimension; )
{
if(dir == SOUTH_WEST)
{
for(arr[x][y]=dimension*dimension+1-count++; x + 1 < dimension && y - 1 >=0; x++, y--)
{
arr[x+1][y-1] = dimension*dimension+1-count++;
}
if(x + 1 >= dimension && y - 1 < 0)
{
y++, dir = NORTH_EAST;
}
else if(y - 1 < 0)
{
x++, dir = NORTH_EAST;
}
else if(x + 1 >= dimension)
y++, dir = NORTH_EAST;
}
else
{
for(arr[x][y]=dimension*dimension+1-count++; x - 1 >= 0 && y + 1 < dimension; x--,y++)
{
arr[x-1][y+1]=dimension*dimension+1-count++;
}
if(x - 1 < 0 && y + 1 >= dimension)
{
x++, dir = SOUTH_WEST;
}
else if (x - 1 < 0)
{
y++, dir = SOUTH_WEST;
}
else if (y + 1 >= dimension)
{
x++, dir = SOUTH_WEST;
}
}
}
inverse2DArray(arr, dimension);
}
if(startIndex==3&&direction==2) //우 상단 시작 왼쪽로 //좌 상단 시작 아래로 응용.
{
for(dir=NORTH_EAST, x=0,y=0, count=1; count <= dimension*dimension; )
{
if(dir == SOUTH_WEST)
{
for(arr[x][y]=count++; x + 1 < dimension && y - 1 >=0; x++, y--)
{
arr[x+1][y-1] = count++;
}
if(x + 1 >= dimension && y - 1 < 0)
{
y++, dir = NORTH_EAST;
}
else if(y - 1 < 0)
{
x++, dir = NORTH_EAST;
}
else if(x + 1 >= dimension)
y++, dir = NORTH_EAST;
}
else
{
for(arr[x][y]=count++; x - 1 >= 0 && y + 1 < dimension; x--,y++)
{
arr[x-1][y+1]=count++;
}
if(x - 1 < 0 && y + 1 >= dimension)
{
x++, dir = SOUTH_WEST;
}
else if (x - 1 < 0)
{
y++, dir = SOUTH_WEST;
}
else if (y + 1 >= dimension)
{
x++, dir = SOUTH_WEST;
}
}
}
inverse2DArray(arr, dimension);
}
if(startIndex==2&&direction==1)
{
for(dir=NORTH_EAST, x=0,y=0, count=1; count <= dimension*dimension; )
{
if(dir == SOUTH_WEST)
{
for(arr[x][y]=dimension*dimension+1-count++; x + 1 < dimension && y - 1 >=0; x++, y--)
{
arr[x+1][y-1] = dimension*dimension+1-count++;
}
if(x + 1 >= dimension && y - 1 < 0)
{
y++, dir = NORTH_EAST;
}
else if(y - 1 < 0)
{
x++, dir = NORTH_EAST;
}
else if(x + 1 >= dimension)
y++, dir = NORTH_EAST;
}
else
{
for(arr[x][y]=dimension*dimension+1-count++; x - 1 >= 0 && y + 1 < dimension; x--,y++)
{
arr[x-1][y+1]=dimension*dimension+1-count++;
}
if(x - 1 < 0 && y + 1 >= dimension)
{
x++, dir = SOUTH_WEST;
}
else if (x - 1 < 0)
{
y++, dir = SOUTH_WEST;
}
else if (y + 1 >= dimension)
{
x++, dir = SOUTH_WEST;
}
}
}
inverse2DArray(arr, dimension);
}
if(startIndex==1 || startIndex==4)
{
show2DArray(arr, dimension);
}
}