山东省第四届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题 平分游戏 题目描述 转眼间又过了一年,又有一届的师兄师姐要毕业了. 有些师兄师姐就去了景驰科技实习. 在景驰,员工是他们最宝贵的财富.只有把每一个人 ...
随机推荐
- PowerDesigner16 安装包及破解文件
一.准备工作 PowerDesigner16 安装包:http://pan.baidu.com/s/11Qv9H 或http://cloud.suning.com/cloud-web/share/li ...
- HDFS冗余数据块的自动删除
HDFS冗余数据块的自动删除 在日常维护hadoop集群的过程中发现这样一种情况: 某个节点由于网络故障或者DataNode进程死亡,被NameNode判定为死亡,HDFS马上自动开始数据块的容错拷贝 ...
- 2016.11.29 activiti实战--第19章--统一身份管理(含自定义用户与数组的实现)
学习资料:<Activiti实战> 第十九章 统一身份管理 本章讲解如何统一业务系统与activiti的用户管理系统. 第5章的时候已经讲解过activiti的用户与组.一般来说业务系统都 ...
- MySQL binlog-do-db选项是危险的[转]
很多人通过 binlog-do-db, binlog-ignore-db, replicate-do-db 和 replicate-ignore-db 来过滤复制(某些数据库), 尽管有些使用, ...
- project 的用法
任务和子任务,树状结构: 点击一个绿色的箭头就可以实现. 时间的话:视图→甘特图→双击“开始时间”修改即可
- MSComm串口类的使用 (程序设计)
参考文档:http://wenku.baidu.com/link?url=MLGQojaxyHnEgngEAXG8oPnISuM9SVaDzNTvg0oTSrrJkMXIR_6MR3cO_Vnh-gr ...
- CSS3 实现背景透明,文字不透明,兼容所有浏览器
<!DOCTYPE html><html><head><meta charset="utf-8"><title>opac ...
- iOS开发系列--让你的应用“动”起来【转载】
概览 原文链接:http://www.cnblogs.com/kenshincui/p/3972100.html 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥i ...
- Redis源码试读(一)源码准备
这里开始查看Redis的源码,之前是在看Unix的环境编程,虽然这本书写的很好,但是只看这个感觉有点隔靴搔痒.你可以知道沙子.水泥.钢筋的特性,但是要想建一栋大楼仍然是另一回事.Unix环境编程要看, ...
- Linux进入单用户模式
有时候配置linux的过程中,因为一些误操作导致系统初始化时堵塞或挂起而无法进入系统,原因往往是因为配置文件设置错误,部分文件被误删之类.遇到这种情况一般新手的做法就是重装(虚拟机不装白不装),但在实 ...