int* buildSnailReverse(int* a, int w, int h)
{
int x;
int y;
int turn = 1; //x축 이동중 : +1 y축 이동중 : -1
int direction = 1; //→,↓ 방향 : +1 ↑,→ 방향 : -1
int move = 0;
int maxMoveX = 1;
int maxMoveY = 1;
int min;
//1. 시작위치(x,y), 초기 축(turn), 축마다 초기이동거리(maxMoveX, maxMoveY)를 초기화해준다.
{
//1.1 행렬에 맞게 초기화해준다.
//1.1.1 너비,높이의 차이가 1인 행렬 or 정사각행렬
if( abs(w-h) == 1 || w-h==0)
{
x=(w-1)/2;
y=(h-1)/2;
turn=1;
}
//1.1.2 너비 또는 높이가 1인 행렬
else if ( w==1 || h==1 )
{
if(w==1)
{
maxMoveY=h-1;
turn=-1;
}
if(h==1)
{
maxMoveX=w-1;
turn=1;
}
x=0;
y=0;
}
//1.1.3 홀수x홀수 행렬
else if( h%2==1 && w%2==1)
{
if( h < w)
{
min=h;
maxMoveX=w - h;
maxMoveY=1;
turn=1;
}
else
{
min=w;
maxMoveX=1;
maxMoveY=h-w;
turn=-1;
}
x=min/2;
y=min/2;
}
//1.1.4 짝수x짝수 행렬
else if( h%2==0 && w%2==0)
{
if( h < w )
{
min = h;
maxMoveX=w-2*(h/2-1)-1;
maxMoveY=1;
turn=1;
}
else
{
min = w;
maxMoveX=1;
maxMoveY=h-2*(w/2-1)-1;
turn=-1;
}
x = min/2-1;
y = min/2-1;
}
//1.2 시작지점을 1로 초기화한다.
a[y*w + x ] = 1;
}
//2. 나머지 수들을 채워넣는다.
/* turn : 1이면 x축이동중
-1이면 y축이동중
direction : 1이면 →,↓
-1이면 ↑,→
*/
for(int i=2 ; i<=w*h ; i++)
{
//x축
if(turn==1)
{
move++;
x+=direction;
//현재 최대이동거리에 도달했을 때
if( move == maxMoveX )
{
move=0;
maxMoveX++;
turn*=-1;
if( h >= w )
{
direction*=-1;
}
}
}
// y축
else
{
move++;
y+=direction;
if( move == maxMoveY )
{
move=0;
maxMoveY++;
turn*=-1;
if( h < w)
{
direction*=-1;
}
}
}
a[y*w + x ] = i;
}
return a;
}
aW50KiBidWlsZFNuYWlsUmV2ZXJzZShpbnQqIGEsIGludCB3LCBpbnQgaCkKCnsKCgoKICAgIGludCB4OwoKCWludCB5OwoKCWludCB0dXJuID0gMTsJCS8veOy2lSDsnbTrj5nspJEJOiArMQl57LaVIOydtOuPmeykkQk6IC0xCgoJaW50IGRpcmVjdGlvbiA9IDE7CS8v4oaSLOKGkwnrsKntlqUJOiArMQnihpEs4oaSIOuwqe2WpQk6IC0xCgoJaW50IG1vdmUgPSAwOwoKCWludCBtYXhNb3ZlWCA9IDE7CgoJaW50IG1heE1vdmVZID0gMTsKCglpbnQgbWluOwoKCQoKCQoKCS8vMS4g7Iuc7J6R7JyE7LmYKHgseSksIOy0iOq4sCDstpUodHVybiksIOy2leuniOuLpCDstIjquLDsnbTrj5nqsbDrpqwobWF4TW92ZVgsIG1heE1vdmVZKeulvCDstIjquLDtmZTtlbTspIDri6QuCgoJewoKCQkvLzEuMSDtlonroKzsl5Ag66ee6rKMIOy0iOq4sO2ZlO2VtOykgOuLpC4KCgkJCS8vMS4xLjEg64SI67mELOuGkuydtOydmCDssKjsnbTqsIAgMeyduCDtlonroKwgb3Ig7KCV7IKs6rCB7ZaJ66CsCgoJCQlpZiggYWJzKHctaCkgPT0gMSB8fCB3LWg9PTApCgoJCQl7CgoJCQkJIHg9KHctMSkvMjsKCgkJCQkgeT0oaC0xKS8yOwoKCQkJCSB0dXJuPTE7CgoJCQl9CgoJCQkKCgkJCS8vMS4xLjIg64SI67mEIOuYkOuKlCDrhpLsnbTqsIAgMeyduCDtlonroKwKCgkJCWVsc2UgaWYgKCB3PT0xIHx8IGg9PTEgKQoKCQkJewoKCQkJCWlmKHc9PTEpCgoJCQkJewoKCQkJCQltYXhNb3ZlWT1oLTE7CgoJCQkJCXR1cm49LTE7CgoJCQkJfQoKCQkJCWlmKGg9PTEpCgoJCQkJewoKCQkJCQltYXhNb3ZlWD13LTE7CgoJCQkJCXR1cm49MTsKCgkJCQl9CgoKCgkJCQl4PTA7CgoJCQkJeT0wOwoKCQkJfQoKCgoJCQkvLzEuMS4zIO2ZgOyImHjtmYDsiJgg7ZaJ66CsCgoJCQllbHNlIGlmKCBoJTI9PTEgJiYgdyUyPT0xKQoKCQkJewoKCQkJCWlmKCBoIDwgdykKCgkJCQl7CgoJCQkJCW1pbj1oOwoKCQkJCQltYXhNb3ZlWD13IC0gaDsKCgkJCQkJbWF4TW92ZVk9MTsKCgkJCQkJdHVybj0xOwoKCQkJCX0KCgkJCQllbHNlCgoJCQkJewoKCQkJCQltaW49dzsKCgkJCQkJbWF4TW92ZVg9MTsKCgkJCQkJbWF4TW92ZVk9aC13OwoKCQkJCQl0dXJuPS0xOwoKCQkJCX0KCgkJCQl4PW1pbi8yOwoKCQkJCXk9bWluLzI7CgoJCQl9CgoKCgkJCS8vMS4xLjQg7Ked7IiYeOynneyImCDtlonroKwKCgkJCWVsc2UgaWYoIGglMj09MCAmJiB3JTI9PTApCgoJCQl7CgoJCQkJaWYoIGggPCB3ICkKCgkJCQl7CgoJCQkJCW1pbiA9IGg7CgoJCQkJCW1heE1vdmVYPXctMiooaC8yLTEpLTE7CgoJCQkJCW1heE1vdmVZPTE7CgoJCQkJCXR1cm49MTsKCgkJCQl9CgoJCQkJZWxzZQoKCQkJCXsKCgkJCQkJbWluID0gdzsJCQkJCQoKCQkJCQltYXhNb3ZlWD0xOwoKCQkJCQltYXhNb3ZlWT1oLTIqKHcvMi0xKS0xOwkKCgkJCQkJdHVybj0tMTsKCgkJCQl9CgoJCQkJeCA9IG1pbi8yLTE7CgoJCQkJeSA9IG1pbi8yLTE7CgoJCQl9CgoKCgkJCS8vMS4yIOyLnOyekeyngOygkOydhCAx66GcIOy0iOq4sO2ZlO2VnOuLpC4KCgkJCWFbeSp3ICsgeCBdID0gMTsKCgkJCQoKCX0KCgoKCS8vMi4g64KY66i47KeAIOyImOuTpOydhCDssYTsm4zrhKPripTri6QuCgoJLyoJdHVybiA6CSAx7J2066m0IHjstpXsnbTrj5nspJEKCgkJCQktMeydtOuptCB57LaV7J2064+Z7KSRCgoJCWRpcmVjdGlvbiA6ICAx7J2066m0IOKGkizihpMKCgkJCQkJLTHsnbTrqbQg4oaRLOKGkgoKCQkJICovCgoJZm9yKGludCBpPTIgOyBpPD13KmggOyBpKyspCgoJewkKCgkJLy947LaVCgoJCWlmKHR1cm49PTEpCgoJCXsKCgkJCW1vdmUrKzsKCgkJCXgrPWRpcmVjdGlvbjsJCQkKCgoKCQkJLy/tmITsnqwg7LWc64yA7J2064+Z6rGw66as7JeQIOuPhOuLrO2WiOydhCDrlYwKCgkJCWlmKCBtb3ZlID09IG1heE1vdmVYICkKCgkJCXsKCgkJCQltb3ZlPTA7CgoJCQkJbWF4TW92ZVgrKzsKCgkJCQl0dXJuKj0tMTsKCgkJCQlpZiggaCA+PSB3ICkKCgkJCQl7CgoJCQkJCWRpcmVjdGlvbio9LTE7CgoJCQkJfQoKCQkJfQoKCQl9CgoJCS8vIHnstpUKCgkJZWxzZQoKCQl7CgoJCQltb3ZlKys7CgoJCQl5Kz1kaXJlY3Rpb247CgoKCgkJCWlmKCBtb3ZlID09IG1heE1vdmVZICkKCgkJCXsKCgkJCQltb3ZlPTA7CQkJCQoKCQkJCW1heE1vdmVZKys7CgoJCQkJdHVybio9LTE7CgoKCgkJCQlpZiggaCA8IHcpCgoJCQkJewoKCQkJCQlkaXJlY3Rpb24qPS0xOwoKCQkJCX0KCgkJCX0KCgkJfQoKCgoJCWFbeSp3ICsgeCBdID0gaTsKCgl9CgoKCgoKCXJldHVybiBhOwoKfQoK