题目描述
Scarlet 最近学会了一个数组魔法,她会在n×n 二维数组上将一个奇数阶方阵按照顺时针或者逆时针旋转 90∘。
首先,Scarlet 会把 1到 n2 的正整数按照从左往右,从上至下的顺序填入初始的二维数组中,然后她会施放一些简易的魔法。
Scarlet 既不会什么分块特技,也不会什么 Splay 套 Splay,她现在提供给你她的魔法执行顺序,想让你来告诉她魔法按次执行完毕后的二维数组。
输入格式
第一行两个整数n,m,表示方阵大小和魔法施放次数。
接下来 m 行,每行 4 个整数 x,y,r,z,表示在这次魔法中,Scarlet 会把以第 x行第 y 列为中心的 2r+1 阶矩阵按照某种时针方向旋转,其中z=0 表示顺时针,z=1 表示逆时针。
输出格式
输出 n行,每行 n 个用空格隔开的数,表示最终所得的矩阵
分析:针对矩阵旋转,如果是顺时针旋转90°
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
以表格中的2为例子,在矩阵中的位置为(1,2),顺时针旋转变成6也就是(2,3),第1行的第2个变成倒数第1列的第2个,即第i行第j个的变成倒数第i列第j个,如果是逆时针旋转,第i行第j个变成第i列倒数第j个
代码:
#include <bits/stdc++.h>
using namespace std;
int n,m;
int c[501][501],d[501][501];
int main() {
int x, y, r, z;
int a = 0;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
a++;
c[i][j] = a;
}
}//将1到n^2的正整数放到矩阵中
for (int i = 1; i <= m; i++) {
cin >> x >> y >> r >> z;
if (z == 0) {//顺时针,第i行第j个变成倒数第i列第j个
for (int i = x - r; i <= x + r; i++) {
for (int j = y - r; j <= y + r; j++) {
d[x - y + j][x + y - i] = c[i][j];
}
}
for (int i = x - r; i <= x + r; i++) {
for (int j = y - r; j <= y + r; j++) {
c[i][j]=d[i][j];
}
}
}
else{//逆时针,第i行第j个变成第i列倒是第j个
for (int i = x - r; i <= x + r; i++) {
for (int j = y - r; j <= y + r; j++) {
d[x + y - j][y - x + i] = c[i][j];
}
}
for (int i = x - r; i <= x + r; i++) {
for (int j = y - r; j <= y + r; j++) {
c[i][j] = d[i][j];
}
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cout << c[i][j]<<" ";
}
cout << endl;
}
return 0;
}