2014年4月14日月曜日

会津大学オンラインジャッジ 問129 


Hide-and-Seek Supporting System
かくれんぼを題材にした問題
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0129


特にショートコードを狙ったわけではないがコード短さ15/168位。
まあまあの結果だと思う、この問題では昔この問題を解いたときに書いたコードを抜けた気がする。
この問題でもpldwさんがコードの短さで突出している。
彼(彼女?)はいったいどんな人物なのだろう。


#include<stdio.h>
#include<math.h>

int main(){
    int n,m;
   
    while(scanf("%d",&n)!=EOF){
        if(n==0)break;
        double wallXs[101],wallYs[101],wallRs[101],px,py,ex,ey,lenP,lenE,r;
        double pDx,pDy,eDx,eDy,peDx,peDy,n1,n2,len3,peLen;
        for(int i=0;i<n;i++){
            scanf("%lf %lf %lf",&wallXs[i],&wallYs[i],&wallRs[i]);
        }
        scanf("%d",&m);
        for(int i=0;i<m;i++){
            scanf("%lf %lf %lf %lf",&px,&py,&ex,&ey);
            bool danger=true;
            for(int j=0;j<n;j++){
                pDx=wallXs[j]-px;
                pDy=wallYs[j]-py;
                eDx=wallXs[j]-ex;
                eDy=wallYs[j]-ey;
                lenP=hypot(pDx,pDy);
                lenE=hypot(eDx,eDy);
                r=wallRs[j];
               //自分と相手が円の内と外の関係
                if((lenP<r&&lenE>r)||(lenP>r&&lenE<r)){
                    danger=false;
                    break;
                }
                //同じ円内にいる
                if(lenP<r&&lenE<r){
                    continue;
                }
                //円から線分へおろした垂線と重なる直線。これからなる半開平面の両側に自分と相手がいるかチェック
                peDx=ex-px;
                peDy=ey-py;
                peLen=hypot(peDx,peDy);
                n1=peDx*pDx+peDy*pDy;
                n2=peDx*eDx+peDy*eDy;
                if((n1<0&&n2>0)||(n1>0&&n2<0)){
                    len3=fabs((pDx*peDy-pDy*peDx)/peLen);
                    //両側にいたので線分と円の距離が条件を満たすか調べる
                    if(len3<=r){
                        danger=false;
                        break;
                    }
                }
            }
            printf("%s\n",danger?"Danger":"Safe");
        }
    }
}

0 件のコメント:

コメントを投稿