#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int N, M, R;
int b[100][100];
void udturn(int **a) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
b[(N - 1) - i][j] = a[i][j];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
a[i][j] = b[i][j];
}
}
}
void rlturn(int **a) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
b[i][(M-1)-j] = a[i][j];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
a[i][j] = b[i][j];
}
}
}
void right_turn(int **a) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
b[j][(N - 1) - i] = a[i][j];
}
}
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
a[i][j] = b[i][j];
}
}
swap(N, M);
}
void left_turn(int **a) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
b[(M-1)-j][i] = a[i][j];
}
}
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
a[i][j] = b[i][j];
}
}
swap(N, M);
}
void five(int **a) {
int n = N / 2;
int m = M / 2;
//1번을 2번으로
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
b[i][j+m] = a[i][j];
}
}
//2번을 3번으로
for (int i = 0; i < n; i++) {
for (int j = m; j < M; j++) {
b[n+i][j] = a[i][j];
}
}
//3번을 4번으로
for (int i = n; i < N; i++) {
for (int j = m; j < M; j++) {
b[i][j-m] = a[i][j];
}
}
//4번을 1번으로
for (int i = n; i < N; i++) {
for (int j = 0; j < m; j++) {
b[i-n][j] = a[i][j];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
a[i][j] = b[i][j];
}
}
}
void six(int **a) {
int n = N / 2;
int m = M / 2;
//1번을 4번으로
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
b[n + i][j] = a[i][j];
}
}
//4번을 3번으로
for (int i = n; i < N; i++) {
for (int j = 0; j < m; j++) {
b[i][m + j] = a[i][j];
}
}
//3번으 2번으로
for (int i = n; i < N; i++) {
for (int j = m; j < M; j++) {
b[i-n][j] = a[i][j];
}
}
//2번을 1번으로
for (int i = 0; i < n; i++) {
for (int j = m; j < M; j++) {
b[i][j-m] = a[i][j];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
a[i][j] = b[i][j];
}
}
}
int main() {
cin >> N >> M >> R;
int **arr = new int*[100];
for (int i = 0; i < 100; i++) {
arr[i] = new int[100];
memset(arr[i], 0, sizeof(int)*100);
}
int r[1000];
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++) {
scanf("%d", &arr[i][j]);
}
}
for (int i = 0; i < R; i++) {
scanf("%d", &r[i]);
}
for (int i = 0; i < R; i++) {
if (r[i] == 1) {
udturn(arr);
}
else if (r[i] == 2) {
rlturn(arr);
}
else if (r[i] == 3) {
right_turn(arr);
}
else if (r[i] == 4) {
left_turn(arr);
}
else if (r[i] == 5) {
five(arr);
}
else {
six(arr);
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
예시 보면서 직관으로 푸는게 더 쉬운 것 같다.
3,4번 연산은 N,M이 바뀌므로 주의할 것.