題目描述
\(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\)個用空格隔開的數,表示最終所得的矩陣
輸入輸出樣例
輸入 #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%的資料,滿足\(r=1\)
對于100%的資料\(1≤n,m≤500\),滿足\(1≤x?r≤x+r≤n,1≤y?r≤y+r≤n\)
思路
簡單說一下思路:暴力!!!
總之就是暴力
轉就完事了
思路部分結束
矩陣旋轉
順時針
先進行上下顛倒,然后交換對角線
逆時針
先進行左右互換,再交換對角線

蒟蒻の代碼
#include<iostream>
#include<cstdio>
#define maxn 550
using namespace std;
inline int read()//快讀
{
char ch;
int fu=1,in=0;
ch=getchar();
while(ch!='-'&&(ch>'9'||ch<'0'))
{
ch=getchar();
}
if(ch=='-')fu=-1;
else in*=10,in+=ch-'0';
ch=getchar();
while(ch>='0'&&ch<='9')
{
in*=10;
in+=ch-'0';
ch=getchar();
}
return in*fu;
}
int n,m;//矩陣大小和運算元
int a[maxn][maxn];//矩陣
inline void output()//輸出矩陣
{
for(register int i=1;i<=n;++i)
{
for(register int j=1;j<=n;++j)
{
printf("%d ",a[i][j]);
}
puts("");
}
}
inline void solve(int x,int y,int r,int z)
{
if(r==0)return;//一階矩陣不需要轉
int rr=(r<<1)+1;//旋轉矩陣階數
if(z)//逆時針
{
for(register int i=1;i<=rr;++i)//左右互換
{
for(register int j=1;j<=r;++j)//只需要遍歷左半邊,因為右邊也順便用過了,中間一列不會交換
{
int tmp=a[x-r+i-1][y-r+j-1];
a[x-r+i-1][y-r+j-1]=a[x-r+i-1][y+r-j+1];
a[x-r+i-1][y+r-j+1]=tmp;
}
}
//output();
//puts("");
for(register int i=2;i<=rr;++i)//對角線交換,畫圖便知第一行根本不會發生交換a[1][1]->a[1][1]
{
for(register int j=1;j<i;++j)//同理只遍歷左下
{
int tmp=a[x-r+i-1][y-r+j-1];
a[x-r+i-1][y-r+j-1]=a[x-r+j-1][y-r+i-1];
a[x-r+j-1][y-r+i-1]=tmp;
}
}
}
else{//順時針旋轉
for(register int i=1;i<=r;++i)//上下顛倒
{
for(register int j=1;j<=rr;++j)//同理只需遍歷上半邊
{
int tmp=a[x-r+i-1][y-r+j-1];
a[x-r+i-1][y-r+j-1]=a[x+r-i+1][y-r+j-1];
a[x+r-i+1][y-r+j-1]=tmp;
}
}
//output();
//puts("");
for(register int i=2;i<=rr;++i)//對角線交換
{
for(register int j=1;j<i;++j)
{
int tmp=a[x-r+i-1][y-r+j-1];
a[x-r+i-1][y-r+j-1]=a[x-r+j-1][y-r+i-1];
a[x-r+j-1][y-r+i-1]=tmp;
}
}
}
//output();
//puts("");
return;
}
int main()
{
n=read(),m=read();
int k=1;
for(register int i=1;i<=n;++i)//填充矩陣
{
for(register int j=1;j<=n;++j)
{
a[i][j]=k;
k++;
}
}
while(m--)//轉起來
{
int x=read(),y=read(),r=read(),z=read();
solve(x,y,r,z);
}
output();
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/196054.html
標籤:其他
上一篇:容器技術(三) Dockerfile 構建鏡像【8】
下一篇:【翻譯】威脅捕捉成熟度模型
