Computer Science/Algorithm

[Algorithm/C] Zig-Zag 배열 만들기

재오니소스 2017. 11. 28. 17:33


#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);

}

}