魔法少女小Scarlet

**

魔法少女小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 个用空格隔开的数,表示最终所得的矩阵

输入输出样例

魔法少女小Scarlet_第1张图片

思路

先把转化好的数组传入到另一个数组中,再将数组的内容传回到适当的位置,利用循环实现多次旋转,最后的得到结果。

代码

#define _CRT_SECURE_NO_WARNINGS 1
#include
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;
}

你可能感兴趣的:(C语言,算法,c语言)