山东省第四届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

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;
}
				
时间: 2025-02-01 13:07:24

山东省第四届ACM程序设计竞赛A题:Rescue The Princess(数学+计算几何)的相关文章

sdut 2603 Rescue The Princess(算是解析几何吧)(山东省第四届ACM省赛A题)

题目地址:sdut 2603 Rescue The Princess Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 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

没有什么不可能—记山东省第六届ACM程序设计竞赛(退役总结帖)

大一下学期,第一次听说了ACM这个词,当时每周六也开设了培训课,但我好像一次也没有去过,当时对这个词并没有什么太大的印象.后来学院里引进了自己的OJ,那时候我连基本的输入输出格式都不懂,当经历了一堆的WA,TLE之后突然换来的一个AC竟带来了莫名的喜悦.后来学院举办了第一届ACM程序设计竞赛,我报名参加了新秀赛和团队赛.三个小时的新秀赛,当时貌似做出了三道,意外的拿到了一等奖,这也成为了我大学生活的一个重要转折点.四个小时的团队赛,做得很艰难,各种不会,最后只做出了一道,排在三等奖的末尾.比赛之

[2013山东省第四届ACM大学生程序设计竞赛]——Rescue The Princess

Rescue The Princess Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 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 immedia

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

Alice and Bob Time Limit: 1000ms   Memory limit: 65536K 题目描述 Alice and Bob like playing games very much.Today, they introduce a new game. There is a polynomial like this: (a0*x^(2^0)+1) * (a1 * x^(2^1)+1)*.......*(an-1 * x^(2^(n-1))+1). Then Alice as

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

Mountain Subsequences 题目描述 Coco is a beautiful ACMer girl living in a very beautiful mountain. There are many trees and flowers on the mountain, and there are many animals and birds also. Coco like the mountain so much that she now name some letter s

[2013山东省第四届ACM大学生程序设计竞赛]——Alice and Bob

Alice and Bob Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Alice and Bob like playing games very much.Today, they introduce a new game. There is a polynomial like this: (a0*x^(2^0)+1) * (a1 * x^(2^1)+1)*.......*(an-1 * x^(2^(n-1))+1). T

2012年湖南省程序设计竞赛E题 最短的名字

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1115 解题报告:输入n个字符串,让你求出可以用来区别这些字符串的最少的前缀总共有多少个字母.可以区别是指每个字符串都取一个自己的前缀,同时保证所有取的这些前缀没有完全相同. 这题用字典树可以做,就是输入的时候把所有的字符串都插入到字典树中,最后把所有被走过不止一次的节点的值都加起来,每个节点的值表示这个节点被走过多少次,然后如果碰到这个节点的值是1的时候总和加1,同时要退出,后面的就不

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

华南师大 2017 年 ACM 程序设计竞赛新生初赛题解 华南师范大学第很多届 ACM 程序设计竞赛新生赛(初赛)在 2017 年 11 月 20 日 - 27 日成功举行,共有 146 名同学有效参赛(做出 1 题).进入决赛的资格初定为完成并通过 5 题或以上,决赛时间是 12 月 3 日,地点未定. 题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也

Sdut 2416 Fruit Ninja II(山东省第三届ACM省赛 J 题)(解析几何)

Time Limit: 5000MS Memory limit: 65536K 题目描写叙述 Haveyou ever played a popular game named "Fruit Ninja"? Fruit Ninja (known as Fruit Ninja HD on the iPad and Fruit Ninja THD for NvidiaTegra 2 based Android devices) is a video game developed by Hal