[伯俊C++]回転16926配列1
質問する
サイズN×Mの配列があるときは迂回したいです.配列は、次のように反時計回りに回転します.
例えば


入力
1行目は、配列のサイズN、M、および実行する回転数Rを与える.
2行目からN行にAを配列する要素Aijがある.
しゅつりょく
入力出力所与の配列がR回回転した結果
https://www.acmicpc.net/problem/16926
に答える
回転入力配列Aの配列Bを作成し、
ここで、回転はアレイの外周から1行ずつ内側に回転します.
この過程で,配列Bを複数回チェックするとタイムアウトが発生する.
筆者の場合はAの一番外側から1行1行中を回っています.
1行の結果を配列Bに保存し、すぐに配列Bを配列Aにコピーします.
ここで、配列Bから配列Aにコピーすると、配列B内のすべての要素がタイムアウトし、配列Aの各外枠に触れたコードがコピーコードとして使用される.


使用するコードは、一番上のコードと同じであることがわかります.)

#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
int n, m, r, dir, **A, **B, min;
int dx[] = { 1, 0, -1, 0 };
int dy[] = { 0, 1, 0, -1 };
void rotate(int start_x, int start_y, int R, int C);
void func();
void printAll(int**& C);
void init();
void init() {
scanf("%d%d%d", &n, &m, &r);
if (n > m)
min = m;
else
min = n;
A = new int* [n];
B = new int* [n];
for (int i = 0; i < n; i++) {
A[i] = new int[m];
B[i] = new int[m];
for (int j = 0; j < m; j++)
scanf("%d", &A[i][j]);
}
}
void printAll(int **&C) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
printf("%d ", C[i][j]);
printf("\n");
}
}
void func() {
while (r--) {
for (int k = 0; k < min / 2; k++) {
dir = 0;
rotate(k, k, n - 2 * k, m - 2 * k);
}
}
printAll(B);
}
void rotate(int start_x, int start_y, int R, int C) {
int x = start_x;
int y = start_y;
int end_x = start_x + R;
int end_y = start_y + C;
int cnt = 2 * (R - 1) + 2 * (C - 1);
while (cnt--) {
int xx = x + dx[dir];
int yy = y + dy[dir];
if (xx < start_x || yy < start_y || xx == end_x || yy == end_y) {
dir = (dir + 1) % 4;
xx = x + dx[dir];
yy = y + dy[dir];
}
int num = A[x][y];
B[xx][yy] = num;
x = xx;
y = yy;
}
x = start_x;
y = start_y;
end_x = start_x + R;
end_y = start_y + C;
cnt = 2 * (R - 1) + 2 * (C - 1);
while (cnt--) {
int xx = x + dx[dir];
int yy = y + dy[dir];
if (xx < start_x || yy < start_y || xx == end_x || yy == end_y) {
dir = (dir + 1) % 4;
xx = x + dx[dir];
yy = y + dy[dir];
}
A[xx][yy] = B[xx][yy];
x = xx;
y = yy;
}
}
int main(void) {
init();
func();
return 0;
}
Reference
この問題について([伯俊C++]回転16926配列1), 我々は、より多くの情報をここで見つけました https://velog.io/@cldhfleks2/16926テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol