[백준 1022] 소용돌이 예쁘게 출력하기

김동근·2021년 2월 19일
0
post-thumbnail
소용돌이 예쁘게 출력하기 1022

유형

구현

풀이

각 좌표에 들어갈 숫자를 찾는 식을 얻어내면 더 빨리 풀 수 있겠지만 그냥 시뮬레이션으로 해도 된다고 생각해서 시뮬레이션으로 풀이하였다. 전체 크기가 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;
}
profile
김동근

0개의 댓글