구현
각 좌표에 들어갈 숫자를 찾는 식을 얻어내면 더 빨리 풀 수 있겠지만 그냥 시뮬레이션으로 해도 된다고 생각해서 시뮬레이션으로 풀이하였다. 전체 크기가 10000x10000 이므로 전부 저장하기 보다는 출력해야하는 크기는 50x5 이기 때문에 그 부분만 저장하여 출력하면 된다.
숫자를 채우는 규칙은 오 위 왼 아 순서로 방향전환을 하고 방향전환 두번할때마다 움직이는 길이가 하나씩 증가한다. 처음 이동하는 길이는 1이고 시작 방향으로 오른쪽이다. r1~r2, c1~c2 범위를 모두 채웠으면 반복을 그만하고 출력하면 된다.
출력칸을 맞추기 위해서 setw
라는 함수를 사용하였다.
#include <bits/stdc++.h>
const int dx[4] = { 1,0,-1,0 };
const int dy[4] = { 0,-1,0,1 };
using namespace std;
int arr[50][5];
int main() {
cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false);
int r1, c1, r2, c2;
cin >> r1 >> c1 >> r2 >> c2;
int x = 0, y = 0, cnt = 1, i = 1, d = 0, value = 0, c = 0, M = 0;
if (x <= c2 && x >= c1 && y <= r2 && y >= r1) {
arr[y - r1][x - c1] = cnt;
M = max(M, cnt);
c++;
}
if (c != ((r2 - r1 + 1) * (c2 - c1 + 1))) {
while (true) {
if (value == 2) {
i++; value = 0;
}
for (int j = 0; j < i; j++) {
cnt++;
x += dx[d];
y += dy[d];
if (x <= c2 && x >= c1 && y <= r2 && y >= r1) {
arr[y - r1][x - c1] = cnt;
M = max(M, cnt);
c++;
if (c == ((r2 - r1 + 1) * (c2 - c1 + 1))) break;
}
}
if (c == ((r2 - r1 + 1) * (c2 - c1 + 1))) break;
d = (d + 1) % 4;
value++;
}
}
int space = 0;
while (M != 0) {
M /= 10;
space++;
}
for (int k = 0; k <= r2 - r1; k++) {
for (int l = 0; l <= c2 - c1; l++) {
cout << setw(space) << arr[k][l] << ' ';
}
cout << '\n';
}
return 0;
}