【翻譯+考據】《刺客信條:英靈殿攻略》OST 古北歐語歌詞(更新至"末日曙光")
阿新 • • 發佈:2022-04-02
題目描述
Scarlet最近學會了一個數組魔法,她會在n*nn∗n二維陣列上將一個奇數階方陣按照順時針或者逆時針旋轉90°,
首先,Scarlet會把11到n^2n
2
的正整數按照從左往右,從上至下的順序填入初始的二維陣列中,然後她會施放一些簡易的魔法。
Scarlet既不會什麼分塊特技,也不會什麼Splay套Splay,她現在提供給你她的魔法執行順序,想讓你來告訴她魔法按次執行完畢後的二維陣列。
輸入格式
第一行兩個整數n,mn,m,表示方陣大小和魔法施放次數。
接下來mm行,每行44個整數x,y,r,zx,y,r,z,表示在這次魔法中,Scarlet會把以第xx行第yy列為中心的2r+12r+1階矩陣按照某種時針方向旋轉,其中z=0z=0表示順時針,z=1z=1表示逆時針。
輸出格式
輸出nn行,每行nn個用空格隔開的數,表示最終所得的矩陣
輸入輸出樣例
輸入 #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
這個主要是推公式,模擬;
我當時想到了複數,複平面內,乘i就是逆時針旋轉90度。順時針就乘 -i;
後來查資料,有c++中有專門的複數實現,複數用了實現旋轉也很方便;
但。。。。 我還沒有去學。
所以,我模擬了一下複數的座標;
先把座標轉換為,以x,y為原點的座標系;
橫:i-x
縱:j-y
複數乘i的模擬:
橫縱座標交換後,橫座標變為負數。
y-j i-x
然後,再變換為原來的座標系
y-j+a i-x+b
萌新第一次寫題解,已經很詳細了。求大佬輕噴。
AC程式碼
#include
using namespace std;
const int N=510;
int m[N][N],g[N][N];
void trans_m(int x,int y,int r,int z){
if(z==1){
for(int i=x-r; i<=x+r; i++){
for(int j=x-r; j<=x+r; j++){
g[y-j+x][i-x+y]=m[i][j];
}
}
}
else {
for(int i=x-r; i<=x+r; i++){
for(int j=x-r; j<=x+r; j++){
g[j-y+x][x-i+y]=m[i][j];
}
}
}
for(int i=x-r; i<=x+r; i++){
for(int j=x-r; j<=x+r; j++){
m[i][j]=g[i][j];
}
}
}
void solve(){
int n,m0,x,y,r,z,num=1;
cin>>n>>m0;
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
m[i][j]=num++;
}
}
for(int i=0; i>x>>y>>r>>z;
trans_m(x,y,r,z);
}
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
cout< ;>