山东省第四届ACM程序设计竞赛A题:Rescue The Princess(数学+计算几何)
Rescue The Princess
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 412 Solved: 168
[Submit][Status][Web Board]
Description
days ago, a beast caught a beautiful princess and the princess was put
in prison. To rescue the princess, a prince who wanted to marry the
princess set out immediately. Yet, the beast set a maze. Only if the
prince find out the maze’s exit can he save the princess.
here comes the problem. The maze is a dimensional plane. The beast is
smart, and he hidden the princess snugly. He marked two coordinates of
an equilateral triangle in the maze. The two marked coordinates are
A(x1,y1) and B(x2,y2). The third coordinate C(x3,y3) is the maze’s exit.
If the prince can find out the exit, he can save the princess. After
the prince comes into the maze, he finds out the A(x1,y1) and B(x2,y2),
but he doesn’t know where the C(x3,y3) is. The prince need your help.
Can you calculate the C(x3,y3) and tell him?
Input
first line is an integer T(1 <= T <= 100) which is the number of
test cases. T test cases follow. Each test case contains two coordinates
A(x1,y1) and B(x2,y2), described by four floating-point numbers x1, y1,
x2, y2 ( |x1|, |y1|, |x2|, |y2| <= 1000.0).
Please notice that A(x1,y1) and B(x2,y2) and C(x3,y3) are in an
anticlockwise direction from the equilateral triangle. And coordinates
A(x1,y1) and B(x2,y2) are given by anticlockwise.
Output
For each test case, you should output the coordinate of C(x3,y3), the result should be rounded to 2 decimal places in a line.
Sample Input
4
-100.00 0.00 0.00 0.00
0.00 0.00 0.00 100.00
0.00 0.00 100.00 100.00
1.00 0.00 1.866 0.50
Sample Output
(-50.00,86.60)
(-86.60,50.00)
(-36.60,136.60)
(1.00,1.00)
题目及算法分析:输入A点坐标,再输入B点坐标,求C点坐标,按A B C的逆时针顺序构成一个等边三角形。
C点必然出现在AB连线的垂直平分线上,然后在确定三边相等就行了。理论上无论哪种情况都会得到两个C点
坐标,但按照要求三点要是逆时针的。故,需要用到向量的叉积运算判断方向问题!另外,这只是常规思路,
还存在斜率为0和斜率不存在的情况,这两种只需要特判解决一下就行了。
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm> using namespace std;
struct point
{
double x,y;
}a,b, mid; double dist(point a, point b)
{
return (double) ( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) );
} int main()
{
int t;
scanf("%d", &t); while(t--)
{
scanf("%lf %lf %lf %lf", &a.x ,&a.y, &b.x, &b.y); if(a.x==0 && b.x==0 ) //dou zai y zhou
{
//斜率为0
mid.x=(a.x+b.x)/2.0;
mid.y=(a.y+b.y)/2.0;
double lon=fabs(a.y-b.y);
lon=lon*lon;
lon=lon-(mid.y-b.y)*(mid.y-b.y);
lon=sqrt(lon);
printf("(%.2lf,%.2lf)\n", -1*lon, mid.y ); }
else if(a.y==0 && b.y==0)
{// 斜率 不存在
mid.x=(a.x+b.x)/2.0;
mid.y=(a.y+b.y)/2.0;
double lon=fabs(a.x-b.x);
lon=lon*lon;
lon=lon-(mid.x-a.x)*(mid.x-a.x);
lon=sqrt(lon);
printf("(%.2lf,%.2lf)\n", mid.x, lon);
}
else
{
double k, x, y;
k=(a.y-b.y)/(a.x-b.x);
k=(-1.0)/k;
mid.x=(a.x+b.x)/2.0;
mid.y=(a.y+b.y)/2.0;
double lon=dist(a, b);
double dd=k*mid.x-mid.y+a.y; x=((2*a.x+2*dd*k)+sqrt( (2*a.x+2*dd*k)*(2*a.x+2*dd*k) - 4*(k*k+1)*(a.x*a.x+dd*dd-lon) ) )/(2.0*(k*k+1)); y=k*x-k*mid.x+mid.y;
point A, B;
A.x = b.x-a.x;
A.y = b.y-a.y;
B.x = x-b.x;
B.y = y-b.y; if( (A.x*B.y - A.y*B.x) > 0 ){
printf("(%.2lf,%.2lf)\n", x, y );
}
else
{
x=((2*a.x+2*dd*k)-sqrt( (2*a.x+2*dd*k)*(2*a.x+2*dd*k) - 4*(k*k+1)*(a.x*a.x+dd*dd-lon) ) )/(2.0*(k*k+1));
y=k*x-k*mid.x+mid.y;
printf("(%.2lf,%.2lf)\n", x, y );
}
}
}
return 0;
}
山东省第四届ACM程序设计竞赛A题:Rescue The Princess(数学+计算几何)的更多相关文章
- 山东省第四届ACM程序设计竞赛A题:Rescue The Princess
Description Several days ago, a beast caught a beautiful princess and the princess was put in prison ...
- 山东省第四届ACM程序设计竞赛部分题解
A : Rescue The Princess 题意: 给你平面上的两个点A,B,求点C使得A,B,C逆时针成等边三角形. 思路: http://www.cnblogs.com/E-star/arch ...
- UPC 2224 Boring Counting ★(山东省第四届ACM程序设计竞赛 tag:线段树)
[题意]给定一个长度为N的数列,M个询问区间[L,R]内大于等于A小于等于B的数的个数. [题目链接]http://acm.upc.edu.cn/problem.php?id=2224 省赛的时候脑抽 ...
- 2013年山东省第四届ACM大学生程序设计竞赛-最后一道大水题:Contest Print Server
点击打开链接 2226: Contest Print Server Time Limit: 1 Sec Memory Limit: 128 MB Submit: 53 Solved: 18 [Su ...
- 山东省第四届ACM大学生程序设计竞赛解题报告(部分)
2013年"浪潮杯"山东省第四届ACM大学生程序设计竞赛排名:http://acm.upc.edu.cn/ranklist/ 一.第J题坑爹大水题,模拟一下就行了 J:Contes ...
- Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)
Alice and Bob Time Limit: 1000ms Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...
- sdut Mountain Subsequences 2013年山东省第四届ACM大学生程序设计竞赛
Mountain Subsequences 题目描述 Coco is a beautiful ACMer girl living in a very beautiful mountain. There ...
- 华南师大 2017 年 ACM 程序设计竞赛新生初赛题解
题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也需要用质 ...
- 第13届 广东工业大学ACM程序设计大赛 C题 平分游戏
第13届 广东工业大学ACM程序设计大赛 C题 平分游戏 题目描述 转眼间又过了一年,又有一届的师兄师姐要毕业了. 有些师兄师姐就去了景驰科技实习. 在景驰,员工是他们最宝贵的财富.只有把每一个人 ...
随机推荐
- lampp、xampp安装文档
第一步:去官网 看这个介绍http://www.apachefriends.org/zh_cn/xampp-linux.html#1677 第二步:下载安装包 2.1 要区分Linux是32位还是64 ...
- AAuto如何设置定时器
在设计视图中(一定要有个Form)点击左下角的功能组件 点击定时器即可切换到代码视图,并添加如下代码.其中我每隔一秒改变一下winform.static2.text的文本值
- PHP中读取文件的几个方法
整理了一下PHP中读取文件的几个方法,方便以后查阅. 1.fread string fread ( int $handle , int $length ) fread() 从 handle 指向的文件 ...
- 手机话费充值和手机流量充值 API
最近正好需要用到手机充值和流量充值接口,网上找到的,记录并分享下. 聚合数据上面有手机充值的接口,也有流量充值的接口:注册以后可以使用它的OpenId和AppKey. 手机话费充值的接口:https: ...
- 【经验】使用Profiler工具分析内存占用情况
Unity3D为我们提供了一个强大的性能分析工具Profiler.今天我们就使用Profiler来具体分析一下官方样例AngryBots的内存使用信息数据. 首先打开Profiler选择Memory选 ...
- Hessian原理与程序设计
Hessian是比較经常使用的binary-rpc.性能较高,适合互联网应用.主要使用在普通的webservice 方法调用.交互数据较小的场景中.hessian的数据交互基于http协议,通常he ...
- ES6使用箭头函数注意点
新事物也是有两面性的,箭头函数有他的便捷有他的优点,但是他也有缺点,他的优点是代码简洁,this提前定义,但他的缺点也是这些,比如代码太过简洁,导致不好阅读,this提前定义,导致无法使用JS进行一些 ...
- 字符串== equals
经常碰到比较字符串的题, eg: public class StringDemo{ private static final String MESSAGE = "taobao"; ...
- Spring学习七----------Bean的配置之自动装配
© 版权声明:本文为博主原创文章,转载请注明出处 Bean的自动装配(Autowiring) no:不启用自动装配,此时需要手动注入.参考:Spring学习三----------注入方式 defaul ...
- Android 开源项目精选
0x00 leakcanary [内存泄漏检测] Leakcanary : A memory leak detection library for Android and Java. 良心企业Squ ...