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");
}
}
}
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿