sgu265 Wizards 計算幾何

2021-07-03 06:10:37 字數 1846 閱讀 1995

題目大意:

乙個空間直角座標系內,對乙個點有三種操作:

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...