Re: [問題] Google Code Jam 2008, EMEA Semifinal-A

看板Prob_Solve (計算數學 Problem Solving)作者 (...)時間12年前 (2012/04/01 20:53), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/3 (看更多)
方才發現第一名的做法比較簡潔 這邊節錄一下他的程式碼 說明在最下面 typedef complex<double> pnt; int main() { int cases; cin >> cases; for (int cas = 0; cas < cases; cas++) { printf("Case #%d: ", cas + 1); pnt ta[3], tb[3]; for (int i = 0; i < 3; i++) cin >> ta[i].real() >> ta[i].imag(); for (int i = 0; i < 3; i++) cin >> tb[i].real() >> tb[i].imag(); pnt ea = ta[1] - ta[0]; pnt eb = tb[1] - tb[0]; pnt s = eb / ea; pnt t = tb[0] - s * ta[0]; pnt ans = t / (1.0 - s); printf("%.7f %.7f\n", ans.real(), ans.imag()); } return 0; } 首先計算出縮放量、旋轉量、位移量 上面程式碼當中 pnt是一個複數,作者用實部存X座標,用虛部存Y座標 ea和eb是兩個三角形對應的邊,形成的向量 =========> 複數相減,就是實部相減&虛部相減,剛好和二維向量減法一樣 s是縮放量+旋轉量 ========> 複數相除,就是長度相除&角度相減 t是位移量 當一個點縮放、旋轉、位移之後,仍舊是同一點的話, 那一點就是答案了! 寫成方程式就是 ans * s + t = ans 移項一下就是 ans = t / (1 - s) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.230.128.138 ※ 編輯: DJWS 來自: 61.230.128.138 (04/01 21:00)

04/02 00:30, , 1F
感謝 D 大的補充說明 :)
04/02 00:30, 1F
文章代碼(AID): #1FU4-mEE (Prob_Solve)
文章代碼(AID): #1FU4-mEE (Prob_Solve)