Rescue The Princess

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 412  Solved: 168
[Submit][Status][Web Board]

Description

Several
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.
Now,
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

The
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(数学+计算几何)的更多相关文章

  1. 山东省第四届ACM程序设计竞赛A题:Rescue The Princess

    Description Several days ago, a beast caught a beautiful princess and the princess was put in prison ...

  2. 山东省第四届ACM程序设计竞赛部分题解

    A : Rescue The Princess 题意: 给你平面上的两个点A,B,求点C使得A,B,C逆时针成等边三角形. 思路: http://www.cnblogs.com/E-star/arch ...

  3. UPC 2224 Boring Counting ★(山东省第四届ACM程序设计竞赛 tag:线段树)

    [题意]给定一个长度为N的数列,M个询问区间[L,R]内大于等于A小于等于B的数的个数. [题目链接]http://acm.upc.edu.cn/problem.php?id=2224 省赛的时候脑抽 ...

  4. 2013年山东省第四届ACM大学生程序设计竞赛-最后一道大水题:Contest Print Server

    点击打开链接 2226: Contest Print Server Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 53  Solved: 18 [Su ...

  5. 山东省第四届ACM大学生程序设计竞赛解题报告(部分)

    2013年"浪潮杯"山东省第四届ACM大学生程序设计竞赛排名:http://acm.upc.edu.cn/ranklist/ 一.第J题坑爹大水题,模拟一下就行了 J:Contes ...

  6. Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)

    Alice and Bob Time Limit: 1000ms   Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...

  7. sdut Mountain Subsequences 2013年山东省第四届ACM大学生程序设计竞赛

    Mountain Subsequences 题目描述 Coco is a beautiful ACMer girl living in a very beautiful mountain. There ...

  8. 华南师大 2017 年 ACM 程序设计竞赛新生初赛题解

    题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也需要用质 ...

  9. 第13届 广东工业大学ACM程序设计大赛 C题 平分游戏

    第13届 广东工业大学ACM程序设计大赛 C题 平分游戏 题目描述 转眼间又过了一年,又有一届的师兄师姐要毕业了. ​ 有些师兄师姐就去了景驰科技实习. 在景驰,员工是他们最宝贵的财富.只有把每一个人 ...

随机推荐

  1. C#中用鼠标移动页面功能的实现(代码控制滚动条)

    项目中需要实现以下功能: 打印预览控件中,可以用鼠标拖动页面,以查看超出显示范围之外的部分内容. 该功能本来可以通过拉动水平和垂直滚动条来实现,但实际使用中,用户更趋向于直接用鼠标拖动页面来实现,很多 ...

  2. 微信小程序-wxs

    你想在页面上使用JavaScript代码吗? 对不起,小程序不支持! 最近,一个项目就有这样的需求,我也就用上了wxs 使用方法很简单: 项目中用的是取小数点2位以及5位 具体请看官方API:WXS

  3. 【LeetCode】Validate Binary Search Tree ——合法二叉树

    [题目] Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defin ...

  4. 高阶函数:filter()

    Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是 ...

  5. windows平台下为Nginx反向代理(负载均衡)使用openssl增加HTTPS/SSL功能。

    1.准备好perl/openssl ActivePerl-5.12.2.1202-MSWin32-x86-293621.msi openssl-0.9.8k.tar.gz 编译 参考这个:http:/ ...

  6. modelsim-altera

    一. 1.  Go to the menu Tools > Options.  2.  In the “General” category, select “EDA Tool Options”. ...

  7. js判断参数类型

    如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...

  8. js中比較好的继承方式

    前面说到了原型和原型链,今天就来说说在面向对象中比較好的继承方式吧.先来看看两种基础的继承方式: 一.构造函数型 function People(name) { this.name=name; } P ...

  9. Tsung 初步介绍安装

    tsung是erlang的一个开源的一个压力测试工具,可以测试包括HTTP, WebDAV, Mysql, PostgreSQL, LDAP, and XMPP/Jabber等服务器.针对 HTTP ...

  10. Spring Cloud 微服务一:Consul注册中心

    Consul介绍 Consul is a service mesh solution providing a full featured control plane with service disc ...