2013西安交大ACM校内赛C题

Description

ZZ和GG有很多大事要决定。在他们实在说服不了对方的时候,他们决定猜拳决定胜负。由于石头剪刀布在设计之初存在巨大的缺陷,有极大的可能出现平手!(事实上,某一天,ZZ和GG猜拳猜了一个下午)。在中科院的领导的帮助下,ZZ和GG开始使用“二维矢量夹角大作战”来决定胜负。

       “二维矢量夹角大作战”是个很简单的游戏,两个人分别写下两个二维矢量(Zi,Zj)和(Gi,Gj)。取这两个矢量的夹角(小于180度的角叫做夹角)。取这个夹角的角平分线,角平分线逆时针方向的那个矢量,就是赢家。只有当两个矢量共线的时候,才是平局。

       这个游戏的平局概率被极大的减小了,ZZ和GG的人生充满了快乐。

       不过,这个游戏需要一个程序来帮助判定谁输谁赢。

Input

第0行:一个数T,代表一共T组数据。(即他们比了T次)

第1…2*T行:T组数据。

每组数据分为两行,第一行为(Zi,Zj),第二行为(Gi,Gj),参看样例

Output

第1..T行: 每行一个字符串。

如果ZZ赢了则输出ZZ win!

如果GG赢了则输出:GG win!

如果平手则输出:WOLAIGEQU!

注意,所有标点符号为半角,请不要切换到中文输入法输入。

Sample Input

4
6 0
1 7
1 2
9 7
1 9
1 9
9 5
7 8

Sample Output

GG win!
ZZ win!
WOLAIGEQU!
GG win!

Hint

Gi,Gj,Zi,Zj的绝对值小于3*10^8

看到题我第一眼的想法是座标变换。好吧,这是徒劳的。后来又想把直角座标系转化为极座标,然后比较角度。好吧,这个略嫌麻烦。如果我们用其中一点与原点作直线,可以将平面直角座标系分成两部分,一部分Z赢,一部分G赢,关于两部分的判断,可以用点与直线的关系中常用的公式,求解直线后将点代入判断点的位置,然后根据情况得到答案。

#include<stdio.h>
#include<stdlib.h>
int main(){
    long t,z1,z2,g1,g2,l;
    long double z,g;
    scanf("%ld",&t);
    for(l=0;l<t;l++){
                     scanf("%ld %ld",&z1,&z2);
                     scanf("%ld %ld",&g1,&g2);
                     if(g1==0){
                               if(z1==0)printf("WOLAIGEQU!\n");
                     else if(((z1<0)&&(g2>0))||((z1>0)&&(g2<0)))printf("ZZ win!\n");
                     else if(((z1>0)&&(g2>0))||((z1<0)&&(g2<0)))printf("GG win!\n");
                               }
                     else{
                          g=g2*1.0/g1;
                     z=z2-g*z1;
                     if(z==0)printf("WOLAIGEQU!\n");
                     else if(((z>0)&&(g1>0))||((z<0)&&(g1<0)))printf("ZZ win!\n");
                     else if(((z>0)&&(g1<0))||((z<0)&&(g1>0)))printf("GG win!\n");
                     }
          }
    system("PAUSE");
    return 0;
    }

点赞