홀수인 자연수 N이 주어지면, 다음과 같이 1부터 N2까지의 자연수를 달팽이 모양으로 N×N의 표에 채울 수 있다.
N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.
첫째 줄에 홀수인 자연수 N(3 ≤ N ≤ 999)이 주어진다. 둘째 줄에는 위치를 찾고자 하는 N2 이하의 자연수가 하나 주어진다.
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.
https://www.acmicpc.net/problem/1913
처음에는 수학적으로 접근하여 맨윗줄부터 규칙을 찾으려했으나. 실패하고, 결국 좌상단부터 이동방향, 위치를 모두 변수로 나타내어 하나씩
2차원배열에 숫자를 찍도록 코드를 짜보았다.
입력값을 받아 n*n크기의 2차원배열을 만든다.
다음으로 숫자 n*n부터 1까지 역순으로 기록할때 사용할 변수들
flag는 방향변수로 0부터 3 까지 아래 오른쪽 위 왼쪽을 나타냄.
down, right, up, left는 아래인덱스끝 오른쪽인덱스끝,.. 으로,
x좌표 y좌표가 해당값과 일치하면 방향을 틀어서 한칸 이동하도록 코드를 짰다.
이중에서
이부분은 문제에서 출력2번째줄로 찾고자하는값의 위치를 기록하는부분이다.
이렇게진행한뒤 마지막으로 모두 출력해주면 끝이다.
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
int main(void) {
int n, m;
scanf("%d\n%d", &n, &m);
int** map = new int* [n]; //메모리설정
for (int i = 0; i < n; i++)
map[i] = new int[n];
for (int i = 0; i < n; i++) //초기화
for (int j = 0; j < n; j++)
map[i][j] = 0;
//0 : ↓
//1 : →
//2 : ↑
//3 : ←
int flag = 0; //방향을 기억
int r = 0, c = 0; //행, 열 위치
//지나온길을 못지나가게 하는 4방향 변수
int down = n, right = n, up = -1, left = 0;
//찾고자하는 값의 위치
int locX, locY;
for (int i = n*n; i >= 1; i--) { //역으로 기록
map[r][c] = i; //현재위치 기록
if (i == m) {
locX = r;
locY = c;
}
if (flag == 0) {
r++;
if (r == down) {
r--;
c++;
flag++;
down--;
}
}
else if (flag == 1) {
c++;
if (c == right) {
c--;
r--;
flag++;
right--;
}
}
else if (flag == 2) {
r--;
if (r == up) {
r++;
c--;
flag++;
up++;
}
}
else if (flag == 3) {
c--;
if (c == left) {
c++;
r++;
flag = 0;
left++;
}
}
}
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++) {
printf("%d ", map[i][j]);
}
printf("\n");
}
printf("%d %d", locX+1, locY+1);
return 0;
}