蹲一个WA第一评测点第17数据、第二评测点第3数据的解决方法
查看原帖
蹲一个WA第一评测点第17数据、第二评测点第3数据的解决方法
125952
欧买歌楼主2022/9/14 16:52

实在查不出来了,蹲个dalao吧。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct Point{
	double x,y;
	Point operator + (const Point pp){return Point{x+pp.x,y+pp.y};};
	Point operator - (const Point pp){return Point{x-pp.x,y-pp.y};};
	Point operator / (const double k){return Point{x/k,y/k};};
	double operator * (const Point pp){return x*pp.y-y*pp.x;};
}p[2][4];
int T;
inline bool check(Point a,Point b){
	Point c = b-a;
	if (c*(p[0][0]-a) > 0){
		for (int i=1;i<4;++i) if (c*(p[0][i]-a) <= 0) return false;
		for (int i=0;i<4;++i) if (c*(p[1][i]-a) >= 0) return false;
	}else if (c*(p[0][0]-a) < 0){
		for (int i=1;i<4;++i) if (c*(p[0][i]-a) >= 0) return false;
		for (int i=0;i<4;++i) if (c*(p[1][i]-a) <= 0) return false;
	}else return false;
	return true;
}

inline void solve(){
	for (int i=0;i<2;++i) for (int j=0;j<4;++j) scanf("%lf%lf",&p[i][j].x,&p[i][j].y);
	double xi,yi,xj,yj;
	for (int i=0;i<2;++i){
		for (int j=0;j<4;++j){
			xi = p[i][(j+1)%4].x+1e-6, yi = p[i][(j+1)%4].y;
			xj = p[i][j].x+1e-6, yj = p[i][j].y;
			if (check(Point{xi,yi},Point{xj,yj})){
				printf("%.10lf %.10lf %.10lf\n",yi-yj,xj-xi,xj*yi-xi*yj);
				return;
			}
			xi = p[i][(j+1)%4].x-1e-6, yi = p[i][(j+1)%4].y;
			xj = p[i][j].x-1e-6, yj = p[i][j].y;
			if (check(Point{xi,yi},Point{xj,yj})){
				printf("%.10lf %.10lf %.10lf\n",yi-yj,xj-xi,xj*yi-xi*yj);
				return;
			}
			xi = p[i][(j+1)%4].x, yi = p[i][(j+1)%4].y+1e-6;
			xj = p[i][j].x, yj = p[i][j].y+1e-6;
			if (check(Point{xi,yi},Point{xj,yj})){
				printf("%.10lf %.10lf %.10lf\n",yi-yj,xj-xi,xj*yi-xi*yj);
				return;
			}
			xi = p[i][(j+1)%4].x, yi = p[i][(j+1)%4].y-1e-6;
			xj = p[i][j].x, yj = p[i][j].y-1e-6;
			if (check(Point{xi,yi},Point{xj,yj})){
				printf("%.10lf %.10lf %.10lf\n",yi-yj,xj-xi,xj*yi-xi*yj);
				return;
			}
		}
	}
}
int main(){
	scanf("%d",&T);
	while (T--) solve();
    return 0;
}
2022/9/14 16:52
加载中...