ICPC2017 Asia Regional Tsukuba G Rendezvous on a Tetrahedron
問題
全ての辺の長さが1の正四面体ABCDの頂点Aから二つの点p, qが与えられた向きに与えられた長さだけ進む。
点は正四面体の辺を通過するとき、辺と進む向きの角度が変化しないように進む。
移動後に二つの点が同じ面の中にいるかを判定せよ。
制約条件
移動後に点がギリギリ辺や頂点のそばにいるケースがない
解法
展開図にして考えると、条件から二点は線分上をうごく。
正四面体の展開図は正三角形4枚になるので平面上に敷き詰めることができて、完全に平面上で考えることができる。
展開図を敷き詰めた平面は斜交座標(AB, ACベクトルを基底としたとき)なので適当な逆行列を掛けて直行座標に戻して考えると楽。
ソースコード
int in(){ string s; cin >> s; int d, l; cin >> d >> l; const double T = PI / 3; double t = s[0] == 'B' ? 2 * T : s[0] == 'C' ? T : 0; t -= d * PI / 180; P p = P(cos(t), sin(t)) * (double)l; //直行座標に変換する P q = P(real(p) * sin(T) - imag(p) * cos(T), imag(p)) / sin(T); //無限に敷き詰めてあるので原点に近いところにもってくる double x = real(q) - round(real(q) / 2) * 2; double y = imag(q) - round(imag(q) / 2) * 2; if(y < 0) x *= -1, y *= -1; if(x < 0){ x += 1; return x + y < 1 ? 0 : 1; } return x + y < 1 ? 2 : 3; } int main(){ int p1 = in(); int p2 = in(); cout << (p1 == p2 ? "YES" : "NO") << endl; return 0; }