Baek Junアルゴリズム16935号:回転アレイ3


リンク
https://www.acmicpc.net/problem/16935
sol 1)実施
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define int int64_t
using namespace std;

int board[100][100],board2[100][100],n,m,r;

void upsideDown(){
  for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) board[i][j] = board2[n - 1 - i][j];
}

void leftToRight(){
  for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) board[i][j] = board2[i][m - 1 - j];
}

void rightRotate(){
  swap(m,n);
  for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) board[i][j] = board2[m - 1 - j][i];
}

void leftRotate(){
  swap(m,n);
  for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) board[i][j] = board2[j][n - 1 - i];
}

void rotateArea(){
  // 1번을 2번으로
  for(int i = 0; i < n >> 1; i++) for(int j = 0; j < m >> 1; j++){
    board[i][m / 2 + j] = board2[i][j];
  }
  // 2번을 3번으로
  for(int i = 0; i < n >> 1; i++) for(int j = m >> 1; j < m; j++){
    board[i + n / 2][j] = board2[i][j];
  }
  // 3번을 4번으로
  for(int i = n >> 1; i < n; i++) for(int j = m >> 1; j < m; j++){
    board[i][j - m / 2] = board2[i][j];
  }
  // 4번을 1번으로
  for (int i = 0; i < n >> 1; i++) for (int j = 0; j < m >> 1; j++) {
	  board[i][j] = board2[i + n / 2][j];
	}
}

void reverseRotateArea(){
  // 1번을 4번으로
  for(int i = 0; i < n >> 1; i++) for(int j = 0; j < m >> 1; j++){
    board[i + n / 2][j]= board2[i][j];
  }
  // 4번을 3번으로
  for(int i = n >> 1; i < n; i++) for(int j = 0; j < m >> 1; j++){
    board[i][j + m / 2] = board2[i][j];
  }
  // 3번을 2번으로
  for(int i = n >> 1; i < n; i++) for(int j = m >> 1; j < m; j++){
    board[i - n / 2][j] = board2[i][j];
  }
  // 2번을 1번으로
  for(int i = 0; i < n >> 1; i++) for(int j = m >> 1; j < m; j++){
    board[i][j - m / 2] = board2[i][j];
  }
}

int32_t main(){
  fastio;
  cin >> n >> m >> r;
  for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) cin >> board[i][j];
  while(r--){
    int q; cin >> q;
    for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) board2[i][j] = board[i][j];
    if(q == 1) upsideDown();
    else if(q == 2) leftToRight();
    else if(q == 3) rightRotate();
    else if(q == 4) leftRotate();
    else if(q == 5) rotateArea();
    else if(q == 6) reverseRotateArea();
  }
  for(int i = 0; i < n; i++){
    for(int j = 0; j < m; j++){
      cout << board[i][j] << ' ';
    }
    cout << "\n";
  }
}
問題に書いてある通りに実施すればいいだけです.