#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <windows.h>
#include <string.h>
void MoveDiagonal(int arr[][32], int *nextPosY, int *currPosX , int *num, int* nextPosX, int* currPosY)
{
arr[*nextPosY][*nextPosX] = ++*num;
*currPosX = *nextPosX;
*currPosY = *nextPosY;
}
void main()
{
int arr[32][32] = { 0 };
arr[0][0] = 1;
int N, num = 1;
bool isCheck = false; // 트리거 변수 (꼭짓점을 지난 후)
bool isRight = true;
int currPosX = 0, currPosY = 0;
int nextPosX = 0, nextPosY = 0;
scanf("%d", &N);
// 1. 밑에 중복 코드 최소화 (아예 같은 로직만)
while (true)
{
// 우측 이동할 때
if (isRight && currPosX + 1 < N && arr[currPosY][currPosX + 1] == 0)
{
// 우측 이동하기 위한 조건
arr[currPosY][++currPosX] = ++num;
while (1)
{
nextPosX = currPosX;
nextPosY = currPosY;
isCheck ? nextPosX++ : nextPosX--;
isCheck ? nextPosY-- : nextPosY++;
// 분기점 지나지 않았을 때 로직과 지났을 때 로직
if (!isCheck && nextPosX >= 0 && nextPosY < N)
{
MoveDiagonal(arr,&nextPosY, &currPosX, &num, &nextPosX, &currPosY);;
}
else if (isCheck && nextPosX < N && nextPosY >= 0)
{
MoveDiagonal(arr, &nextPosY, &currPosX, &num, &nextPosX, &currPosY);
}
else break; // 해당 방향으로 더 그을 수 없을 때,
}
isRight = false;
}
else if (!isRight && currPosY + 1 < N && arr[currPosY + 1][currPosX] == 0)
{
arr[++currPosY][currPosX] = ++num;
while (1)
{
nextPosX = currPosX;
nextPosY = currPosY;
isCheck ? nextPosX-- : nextPosX++;
isCheck ? nextPosY++ : nextPosY--;
if (!isCheck && nextPosX < N && nextPosY >= 0)
{
MoveDiagonal(arr, &nextPosY, &currPosX, &num, &nextPosX, &currPosY);
}
else if (isCheck && nextPosY < N && nextPosX >= 0)
{
MoveDiagonal(arr, &nextPosY, &currPosX, &num, &nextPosX, &currPosY);
}
else break; // 해당 방향으로 더 그을 수 없을 때,
}
isRight = true;
}
else if (!isCheck)
{
isCheck = true;
isRight = !isRight;
}
else break;
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
printf("%3d", arr[i][j]);
}
printf("\n");
}
}