답안 #508723

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
508723 2022-01-13T15:58:14 Z rainboy 회전 (JOI12_rotate) C
100 / 100
391 ms 21212 KB
#include <stdio.h>

#define N	2000

int di[] = { -1, 0, 1, 0 };
int dj[] = { 0, 1, 0, -1 };

int ej[(N + 2) * (N + 2)][4];

int nxt(int u, int v, int r) {
	int h;

	for (h = 0; h < 4; h++)
		if (ej[v][h] == u)
			return ej[v][(h + 2 + r) % 4];
	return -1;
}

void reattach(int u, int v, int w) {
	int h;

	for (h = 0; h < 4; h++)
		if (ej[u][h] == v) {
			ej[u][h] = w;
			return;
		}
}

int main() {
	static char cc[N][N + 1], cc_[N][N + 1];
	int n, q, h, i, j, i_, j_, k, l, u, v, w, x, y;

	scanf("%d%d", &n, &q);
	for (i = 0; i < n; i++)
		scanf("%s", cc[i]);
	for (i = 0; i <= n + 1; i++)
		for (j = 0; j <= n + 1; j++) {
			u = i * (n + 2) + j;
			for (h = 0; h < 4; h++) {
				i_ = i + di[h], j_ = j + dj[h], v = i_ * (n + 2) + j_;
				ej[u][h] = i_ >= 0 && i_ <= n + 1 && j_ >= 0 && j_ <= n + 1 ? v : -1;
			}
		}
	while (q--) {
		static int qu1[N * 4], qu2[N * 4];

		scanf("%d%d%d", &i, &j, &l);
		u = 0 * (n + 2) + 0, v = 0 * (n + 2) + 1;
		for (k = 2; k <= j; k++)
			w = nxt(u, v, 0), u = v, v = w;
		u = nxt(u, v, -1);
		for (k = 1; k <= i; k++)
			w = nxt(u, v, 0), u = v, v = w;
		for (h = 0; h < 4; h++) {
			for (k = 1; k <= l; k++) {
				qu1[h * l + k - 1] = v, qu2[h * l + k - 1] = nxt(u, v, 1);
				if (k < l)
					w = nxt(u, v, 0), u = v, v = w;
			}
			u = nxt(u, v, 1);
		}
		for (h = 0; h < 4; h++)
			for (k = 1; k <= l; k++) {
				reattach(qu1[h * l + k - 1], qu2[h * l + k - 1], qu2[(h + 1) % 4 * l + k - 1]);
				reattach(qu2[h * l + k - 1], qu1[h * l + k - 1], qu1[(h + 3) % 4 * l + k - 1]);
			}
	}
	u = 0 * (n + 2) + 0, v = 1 * (n + 2) + 0;
	for (i = 1; i <= n; i++) {
		x = nxt(u, v, 1), y = v;
		for (j = 1; j <= n; j++) {
			w = nxt(x, y, 0), x = y, y = w;
			cc_[i - 1][j - 1] = cc[w / (n + 2) - 1][w % (n + 2) - 1];
		}
		if (i < n)
			w = nxt(u, v, 0), u = v, v = w;
	}
	for (i = 0; i < n; i++)
		printf("%s\n", cc_[i]);
	return 0;
}

Compilation message

rotate.c: In function 'main':
rotate.c:33:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   33 |  scanf("%d%d", &n, &q);
      |  ^~~~~~~~~~~~~~~~~~~~~
rotate.c:35:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   35 |   scanf("%s", cc[i]);
      |   ^~~~~~~~~~~~~~~~~~
rotate.c:47:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   47 |   scanf("%d%d%d", &i, &j, &l);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 796 KB Output is correct
2 Correct 2 ms 844 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 218 ms 21208 KB Output is correct
2 Correct 0 ms 276 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 255 ms 21180 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 299 ms 21188 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 329 ms 21156 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 346 ms 21212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 380 ms 21184 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 344 ms 21184 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 391 ms 21112 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 374 ms 21184 KB Output is correct