1. 程式人生 > 其它 >P4924 [1007]魔法少女小Scarlet 題解

P4924 [1007]魔法少女小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\)個用空格隔開的數,表示最終所得的矩陣

輸入輸出樣例

輸入
5 4
2 2 1 0
3 3 1 1
4 4 1 0
3 3 2 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、二維陣列逆時針旋轉90度

分析上圖:
數字:\(1\),原座標:\(a[1][1]\)

,新座標:\(a[3][1]\)
數字:\(2\),原座標:\(a[1][2]\),新座標:\(a[2][1]\)
數字:\(3\),原座標:\(a[1][3]\),新座標:\(a[1][1]\)
數字:\(4\),原座標:\(a[2][1]\),新座標:\(a[3][2]\)
數字:\(5\),原座標:\(a[2][2]\),新座標:\(a[2][2]\)
數字:\(6\),原座標:\(a[2][3]\),新座標:\(a[1][2]\)
...

結論:
1、原來的行,變成了現在的列,即\(i->j\),這個很顯然。
2、但是列不是這樣的簡單變成行,而是\(1->3,2->2,3->1,1->3,2->2,3->1\)

,這是啥規律呢?就是相加的和是\(n+1\)嘛,所以 \(j->(n+1-i)\)

2、二維陣列順時針旋轉90度