題目大意:
乙個空間直角座標系內,對乙個點有三種操作:
1.平移(x
,y,z
)⇒(x
+a,y
+b,z
+c) ;
2.縮放(x
,y,z
)⇒(a
x,by
,cz)
; 3.
繞乙個向量(x
,y,z
) 順時針旋轉
α 角
( 角度制)。
對空間內的
m 個點給出
n個操作,求每個點在操作後的座標。
分析:
我們用i→
,j→,
k→表示x,
y,z 軸上的單位向量,和乙個記錄平移的p→
向量( 根據二維的仿射變換可以知道平移是不影響縮放和旋轉的)。
平移直接給p→
平移即可;
縮放對p→
,i→,
j→,k
→ 依次縮放;
旋轉對p→
,i→,
j→,k
→ 依次旋轉;
對於每個點(x
,y,z
) ,操作後就是(x
i→,y
j→,z
k→)+
p→。 關鍵就是怎樣旋轉。
對於點p 繞q→
旋轉α,求出p→
在q→ 上的投影t→
,令p→
=p→−
t→,那麼m→
=q→×
p→與p
→ 構成的平面與q→
垂直,將m→
調整為p→
的長度,旋轉後的點即為
cos(α)
p→+sin(α
)m→+
t→.分析:
#include
#include
typedef double db;
using namespace std;
const db pi = acos(-1.0);
const db eps = 1e-10;
struct pot
void read()
void print()
void trans(db tx, db ty, db tz)
void scal(db tx, db ty, db tz)
void rotate(const pot &a, db alpha)
friend pot operator + (const pot &a, const pot &b)
friend pot operator - (const pot &a, const pot &b)
friend pot operator * (const pot &a, db k)
friend pot operator / (const pot &a, db k)
friend db operator * (const pot &a, const pot &b)
friend pot operator ^ (const pot &a, const pot &b)
db len()
void adjust(db l)
}p[4], v;
int main()
}scanf("%d", &m);
while(m--)
#ifndef online_judge
fclose(stdin);
fclose(stdout);
#endif
return
0;}
265 粉刷房子 II
首先這題可以和粉刷房子這題一樣解法,對於i號房子,遍歷k種顏色,對於每一種,都去找i 1號房子除該顏色之外的最小花費。但上一題是3種顏色,總複雜度o n 這題k種顏色,複雜度o nk 2 題目要求o nk 則對於i號房子我們儲存下當前房子最小的花費以備i 1號房子使用,但因為相鄰房子不能塗相同顏色的...
265 粉刷房子 II
題目描述 假如有一排房子,共 n 個,每個房子可以被粉刷成 k 種顏色中的一種,你需要粉刷所有的房子並且使其相鄰的兩個房子顏色不能相同。當然,因為市場上不同顏色油漆的 不同,所以房子粉刷成不同顏色的花費成本也是不同的。每個房子粉刷成不同顏色的花費是以乙個 n x k 的矩陣來表示的。例如,costs...
SGU223 狀態壓縮
下午花了兩個小時把yali中學 陳丹琦的 基於連通性狀態壓縮的動態規劃問題 啃完,插頭dp還真是個麻煩的東西。相較sgu223算乙個水題了,給定n n的棋盤,擺放m個不相互攻擊的棋子,棋子攻擊範圍為相鄰8個位置。求方案數。dp i j k 第i行,狀態為j,放了k個棋子的方案數,dp i j k s...