結果

問題 No.760 Where am I moved to?
ユーザー chocorusk
提出日時 2018-12-08 00:28:28
言語 C++11
(gcc 4.8.5)
結果
AC  
実行時間 3 ms
コード長 1,704 Byte
コンパイル時間 1,187 ms
使用メモリ 8,912 KB
最終ジャッジ日時 2018-12-08 00:28:36

テストケース

テストケース表示
入力 結果 実行時間
使用メモリ
1a AC 2 ms
6,872 KB
1b AC 3 ms
6,868 KB
1c AC 2 ms
6,872 KB
2a AC 3 ms
6,868 KB
2b AC 2 ms
6,868 KB
2c AC 2 ms
6,872 KB
2d AC 2 ms
6,868 KB
2e AC 2 ms
6,868 KB
99_system_test1.txt AC 3 ms
8,912 KB
99_system_test2.txt AC 2 ms
6,868 KB
99_system_test3.txt AC 3 ms
6,872 KB
テストケース一括ダウンロード

ソースコード

diff #
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <bitset>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
#include <complex>
#include <unordered_map>
#include <unordered_set>
#include <random>
using namespace std;
typedef long long int ll;
//typedef pair<int, int> P;
const double PI=acos(-1.0);
const double EPS=1e-10;
double add(double a, double b){
    if(abs(a+b)<EPS*(abs(a)+abs(b))) return 0;
    return a+b;
}
struct P{
    double x, y;
    P() {}
    P(double x, double y): x(x), y(y){
    }
    P operator+ (P p){
        return P(add(x, p.x), add(y, p.y));
    }
    P operator- (P p){
        return P(add(x, -p.x), add(y, -p.y));
    }
    P operator* (double d){
        return P(x*d, y*d);
    }
    double dot(P p){
        return add(x*p.x, y*p.y);
    }
    double det(P p){
        return add(x*p.y, -y*p.x);
    }
    bool operator< (const P& p) const{
        if(abs(x-p.x)>EPS){
            return x<p.x;
        }else{
            return y<p.y-EPS;
        }
    }
};
double atan(P p){
	return atan2(p.y, p.x);
}
P rot(P p, double t){
	return P(p.x*cos(t)-p.y*sin(t), p.x*sin(t)+p.y*cos(t));
}
int main()
{
	double xa, ya, ta;
	cin>>xa>>ya>>ta;
	ta=ta/180*PI;
	P p0=P(xa, ya);
	double x11, y11, x12, y12, x21, y21, x22, y22;
	cin>>x11>>y11>>x12>>y12>>x21>>y21>>x22>>y22;
	P p1=P(x11, y11), p2=P(x12, y12), q1=P(x21, y21), q2=P(x22, y22);
	double t=atan(p2-p1)-atan(q2-q1);
	double tb=ta+t;
	if(tb<0){
		while(tb<0) tb+=(2*PI);
	}else if(tb>=2*PI){
		while(tb>=2*PI) tb-=(2*PI);
	}
	P q0=p1-rot(q1-p0, t);
	printf("%.3lf %.3lf %.3lf\n", q0.x, q0.y, tb/PI*180);
    return 0;
}
0