formula
시계 45도만 구현해놓고 반복해서 사용
반시계 45도의 경우 315도를 돈 것과 같은 효과
음수처리를 위해 다음 수식 사용
D = (D + 360) % 360;
혹은
if(D<0) D += 360
이후
int cnt = D / 45;
for (int c = 0; c < cnt; c++) {
rotate45();
}
45도로 나눠서 돌아갈 횟수만큼 회전
Implementation
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
#define MAX 550
int T, N, D;
int matrix[MAX][MAX];
int temp[MAX][MAX];
void copyMap(int copy[MAX][MAX], int origin[MAX][MAX]) {
for (int r = 1; r <= N; r++) {
for (int c = 1; c <= N; c++) {
copy[r][c] = origin[r][c];
}
}
}
void rotate45() {
copyMap(temp, matrix);
int arr[MAX] = { 0 };
int half = (N + 1) / 2; //중점 좌표
// 가운데 행
for (int c = 1; c <= N; c++) {
arr[c] = temp[half][c];
}
for (int i = 1; i <= N; i++) {
matrix[i][i] = arr[i];
}
// 대각선1
for (int i = 1; i <= N; i++) {
arr[i] = temp[i][i];
}
for (int i = 1; i <= N; i++) {
matrix[i][half] = arr[i];
}
// 수직선
for (int i = 1; i <= N; i++) {
arr[i] = temp[i][half];
}
for (int i = 1; i <= N; i++) {
matrix[i][N - i + 1] = arr[i]; // 좌표 조정
}
// 대각선2
for (int i = 1; i <= N; i++) {
arr[i] = temp[N - i + 1][i];
}
for (int c = 1; c <= N; c++) {
matrix[half][c] = arr[c];
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> T;
for (int i = 0; i < T; i++) {
cin >> N >> D;
D = (D + 360) % 360;
for (int r = 1; r <= N; r++) {
for (int c = 1; c <= N; c++) {
cin >> matrix[r][c];
}
}
int cnt = D / 45;
for (int c = 0; c < cnt; c++) {
rotate45();
}
for (int r = 1; r <= N; r++) {
for (int c = 1; c <= N; c++) {
cout << matrix[r][c] << " ";
}
cout << "\n";
}
}
}