C++模拟与高精度——魔法少女小Scarlet

题目描述

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°

123
456
789

以表格中的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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值