**
魔法少女小Scarlet
**
题目
- 魔法少女小Scarlet
- 题目描述
- 输入格式
- 输出格式
- 输入输出样例
- 思路
- 代码
题目描述
Scarlet 最近学会了一个数组魔法,她会在 n×n 二维数组上将一个奇数阶方阵按照顺时针或者逆时针旋转 90° 。
首先,Scarlet 会把 1 到 n^2的正整数按照从左往右,从上至下的顺序填入初始的二维数组中,然后她会施放一些简易的魔法。
Scarlet 既不会什么分块特技,也不会什么 Splay 套 Splay,她现在提供给你她的魔法执行顺序,想让你来告诉她魔法按次执行完毕后的二维数组。
输入格式
第一行两个整数 n,m表示方阵大小和魔法施放次数。
接下来 m 行,每行 4 个整数 x,y,r,z,表示在这次魔法中,Scarlet 会把以第 x 行第 y 列为中心的 2r+1 阶矩阵按照某种时针方向旋转,其中 z=0 表示顺时针,z=1 表示逆时针。
输出格式
输出 n 行,每行 n 个用空格隔开的数,表示最终所得的矩阵
输入输出样例
思路
先把转化好的数组传入到另一个数组中,再将数组的内容传回到适当的位置,利用循环实现多次旋转,最后的得到结果。
代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int a[1000][1000];
int b[1000][1000];
void chuangershuzu(int p)//创建一个1到n^2的二维数组
{int i = 0;int j = 0;int k = 0;for (i = 0; i <p; i++){for (j = 0; j < p; j++){a[i][j] = ++k;}}}
void xuanzhuanshuzu(int x,int y,int r,int z)
{if (z == 0)//顺时针{for (int i = 0; i <= 2 * r; i++){for (int j = 0; j <= 2 * r; j++){b[i][j] = a[x + r - 1 - j][y - r - 1 + i];//x+r-1是应该旋转的最后一行,y-r-1是第一列,这样就可以找到左下角的数,然后把每一列分别旋转到行的位置,就实现了顺时针旋转}}for (int i = 0; i <= 2 * r; i++)//减一是因为数组有第0行,而现实说的时候没有{for (int j = 0; j <= 2 * r; j++){a[x - r - 1 + i][y - r - 1 + j] = b[i][j];//将b数组传回去}}}else if(z==1)//逆时针{for (int i = 0; i <= 2 * r; i++){for (int j = 0; j <= 2 * r; j++)//参考顺时针旋转{b[i][j] = a[x - r - 1 + j][y + r - 1 - i];}}for (int i = 0; i <= 2 * r; i++){for (int j = 0; j <= 2 * r; j++){a[x - r - 1 + i][y - r - 1 + j] = b[i][j];}}}
}
int main()
{int n = 0;int m = 0;scanf("%d %d", &n, &m);getchar();int i = 0;int j = 0;int x = 0; int y = 0; int r = 0; int z = 0;chuangershuzu(n);//创建二维数组for (i = 0; i < m; i++){scanf("%d %d %d %d", &x, &y, &r, &z);xuanzhuanshuzu(x,y,r,z);//旋转数组}for (i = 0; i <n; i++)//输出{for (j = 0; j < n; j++){printf("%d ",a[i][j]);}printf("\n");}return 0;
}