[伯準1022]きれいな渦を出力


渦1022を見事に出力

を選択します。

구현

に答える


各座標におけるディジタルルックアップ式が得られ,より速く解くことができるが,直接シミュレーションして解くことができると考えられるので,シミュレーションで解く.総サイズは10000×100000なので、全て保存するよりも50 x 5を出力する方が良いので、保存して出力するだけです.
数字を埋め込むルールは、5桁の左芽順に方向を切り替え、2回切り替えるたびに移動の長さが1つ増えます.1回目の移動の長さは1で、開始方向は右側です.r 1~r 2,c 1~c 2の範囲がすべて満たされていれば、繰返しを停止し、出力すればよい.
出力バーを調整するために、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;
}