题目描述(哈哈哈我把题改的面目全非)
sln和zx是坐标轴上两个有位置的点,她们手拉手连成了一条线。已知坐标,ypq线的一端,她想跳过这条线只有一种跳法,就是跳到自己关于线的对称点上,请问她应该骗rax站在哪里,才能刚好跳到她头上。哈哈哈哈哈哈哈我要笑疯了,rax看到了千万别打我
输入1
0 0 1 1
1
1 0
输出1
0.000 1.000
输入2
0 1 2 5
2
1 1
3 10
输出2
-0.600 1.800
5.400 8.800
这是正经的题解:我用了相似,然后导呀导呀就导出来了用了
正解好像用了向量集合?其他人好像用了解析集合·
大家不要相信下面这些代码,在洛谷至今上只过了一个点......
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std; int main() { freopen("line.in","r",stdin); freopen("line.out","w",stdout); double ax,ay,bx,by,cx,cy; int n; scanf("%lf%lf%lf%lf",&ax,&ay,&bx,&by); double a = (ay - by) / (bx - ax),b = 0 - ay - a * ax;//求解析式 double x = abs(ax - bx),y = abs(ay - by),xie = sqrt(x * x + y * y); //各边长度比 scanf("%d",&n); for(int i = 1;i <= n;i++) { scanf("%lf%lf",&cx,&cy); double dx,dy,juli; juli = abs(a * cx + cy + b) / sqrt(a * a + 1);//点到直线距离 double xx = (0 - b - cy) / a,yy = 0 - b - a * cx;//决定横纵坐标是增大还是减小 if(xx > cx){ dx = cx + 2 * juli * (y / xie); } else{ dx = cx - 2 * juli * (y / xie); } if(yy > cy){ dy = cy + 2 * juli * (x / xie); } else{ dy = cy - 2 * juli * (x / xie); } printf("%0.3f %0.3f",dx,dy); } return 0; }
想我考试时竟然没删freopen前的斜杠,然后就爆零了......