洛谷4924 [1007]魔法少女小scarlet

模拟水题

Posted by yjjr's blog on October 8, 2018

标签:模拟

题目

题目传送门

题目描述

Scarlet最近学会了一个数组魔法,她会在二维数组上将一个奇数阶方阵按照顺时针或者逆时针旋转90°,

首先,Scarlet会把的正整数按照从左往右,从上至下的顺序填入初始的二维数组中,然后她会施放一些简易的魔法。

Scarlet既不会什么分块特技,也不会什么Splay套Splay,她现在提供给你她的魔法执行顺序,想让你来告诉她魔法按次执行完毕后的二维数组。

输入输出格式

输入格式

第一行两个整数,表示方阵大小和魔法施放次数。

接下来行,每行个整数,表示在这次魔法中,Scarlet会把以第行第列为中心的阶矩阵按照某种时针方向旋转,其中表示顺时针,表示逆时针。

输出格式

输出行,每行个用空格隔开的数,表示最终所得的矩阵

输入输出样例

输入样例#1

5 4
2 2 1 0
3 3 1 1
4 4 1 0
3 3 2 1

输出样例#1

5 10 3 18 15
4 19 8 17 20
1 14 23 24 25
6 9 2 7 22
11 12 13 16 21

说明

对于50%的数据,满足

对于100%的数据,满足

题解

简单的pj组模拟题,洛谷月赛良心题qwq(打波广告就逃)

每次模拟旋转就好了

平面直角坐标系中坐标旋转变化公式

  • 顺时针:
  • 逆时针:

code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
#define mem(x,num) memset(x,num,sizeof x)
#define reg(x) for(int i=last[x];i;i=e[i].next)
using namespace std;
inline ll read(){
	ll f=1,x=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
//******head by yjjr******
const int maxn=3e3+6;
int b[maxn][maxn],a[maxn][maxn],n,m;
void Move(int x,int y,int r,int z){
	if(z==0)
		rep(i,x-r,x+r)rep(j,y-r,y+r){
			int nx=i-x,ny=j-y;
			b[x+ny][y-nx]=a[i][j];
		}
	else rep(i,x-r,x+r)rep(j,y-r,y+r){
			int nx=i-x,ny=j-y;
			b[x-ny][y+nx]=a[i][j];
		}
	rep(i,x-r,x+r)rep(j,y-r,y+r)a[i][j]=b[i][j];
}
int main(){
	n=read(),m=read();
	rep(i,1,n)rep(j,1,n)a[i][j]=n*(i-1)+j;
	rep(i,1,m){
		int x=read(),y=read(),r=read(),z=read();
		Move(x,y,r,z);
	}
	rep(i,1,n){rep(j,1,n)cout<<a[i][j]<<' ';cout<<endl;}
	return 0;
}
本文可以转载,但必须附上原文链接,否则你会终生找不到妹子!!!欢迎关注我的CSDN: ahyjjr