時間限制:
2000 ms | 記憶體限制:
65535 kb
難度:5
描寫敘述
平面上有不超過10000個點。座標都是已知的。如今可能對全部的點做下面幾種操作:
平移一定距離(m),相對x軸上下翻轉(x),相對y軸左右翻轉(y),座標縮小或放大一定的倍數(s),全部點對座標原點逆時針旋轉一定角度(r)。
操作的次數不超過1000000次,求終於全部點的座標。
輸入
僅僅有一組測試資料
測試資料的第一行是兩個整數n,m,分別表示點的個數與操作的個數(n<=10000,m<=1000000)
隨後的一行有n對數對,每乙個數對的第乙個數表示乙個點的x座標,第二個數表示y座標。這些點初始座標大小絕對值不超過100。
隨後的m行,每行代表一種操作,行首是乙個字元:
首字元假設是m,則表示平移操作。該行後面將跟兩個數x,y。表示把全部點按向量(x,y)平移;
首字元假設是x。則表示把全部點相對於x軸進行上下翻轉;
首字元假設是y,則表示把全部點相對於y軸進行左右翻轉;
首字元假設是s。則隨後將跟乙個數p,表示座標放大p倍;
首字元假設是r,則隨後將跟乙個數a,表示全部點相對座標原點逆時針旋轉一定的角度a(單位是度)
輸出每行輸出兩個數。表示乙個點的座標(對結果四捨五入到小數點後1位,輸出一位小數字)
點的輸出順序應與輸入順序保持一致
例子輸入
2 5例子輸出1.0 2.0 2.0 3.0xy
m 2.0 3.0
s 2.0
r 180
-2.0 -2.0分析:假設依照題目描寫敘述的那樣模擬。肯定會超時。這時就要找一種高速變換的方法。0.0 0.0
這樣就能夠先算出經過m次變換後形成的終於矩形,然後用點的座標乘以矩形就能夠求出答案。
#include #include #include #define pi acos(-1.0)
struct matrix
matrix multi(matrix a, matrix b) }}
return res;
}matrix translation(matrix a, double p, double q)
matrix scale(matrix a, double p)
matrix turn_ud(matrix a)
matrix turn_lr(matrix a)
matrix rotate(matrix a, double angle)
};struct point p[10005];
int main()
else if(op[0] == 's')
else if(op[0] == 'r')
}for(int i = 0; i < n; i++)
return 0;
}
NYOJ 298 點的變換 矩陣乘法
最好還是自己手推一下矩陣式子.不算太難.但是有一些小知識 首先當然是矩陣的細節.矩陣是不支援交換率的.所以如圖的式子乘進去時要放在左邊.還有的比如說 cmath裡的sin函式用的是弧度制.需要把度數 180 m pi m pi是cmath裡定義的常數 double在取固定小數字的時候小負數四捨五入會...
座標字元NYOJ 298 點的變換 矩陣快速冪
在寫這篇文章之前,已經寫過了幾篇關於改座標字元主題的文章,想要了解的朋友可以去翻一下之前的文章 時光制約 2000 ms 記憶體制約 65535 kb 難度 5 每日一道理 聰明人學習,像搏擊長空的雄鷹,仰視一望無際的大地 愚笨的人學習,漫無目的,猶如亂飛亂撞的無頭飛蛾 刻苦的人學習,像彎彎的河流,...
矩陣十題1(nyoj298)
繼續深造矩陣類題目,看到大佬們都有矩陣十題部落格,我也學習了,只有題目,沒有解析系列1 通過矩陣變換將所有操作都存到矩陣中,最後輸出答案即可。矩陣的構造方法 直接上 include include include include include include include include a 3...