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;
}