Cupid's Arrow
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 702 Accepted Submission(s): 252
Problem Description傳說世上有一支丘位元的箭,凡是被這支箭射到的人,就會深深的愛上射箭的人。
世上無數人都曾經夢想得到這支箭。Lele當然也不例外。不過他想,在得到這支箭前,他總得先學會射箭。
日子一天天地過,Lele的箭術也越來越強,漸漸得,他不再滿足於去射那圓形的靶子,他開始設計各種各樣多邊形的靶子。
不過,這樣又出現了新的問題,由於長時間地練習射箭,Lele的視力已經高度近視,他現在甚至無法判斷他的箭射到了靶子沒有。所以他現在只能求助於聰明的Acmers,你能幫幫他嘛?
Input本題目包含多組測試,請處理到檔案結束。
在每組測試的第一行,包含一個正整數N(2<N<100),表示靶子的頂點數。
接著N行按順時針方向給出這N個頂點的x和y座標(0<x,y<1000)。
然後有一個正整數M,表示Lele射的箭的數目。
接下來M行分別給出Lele射的這些箭的X,Y座標(0<X,Y<1000)。
Output對於每枝箭,如果Lele射中了靶子,就在一行裡面輸出"Yes",否則輸出"No"。
Sample Input
410 1020 1020 510 5215 825 8
Sample Output
YesNo
Authorlinle
Source2007省賽集訓隊練習賽(6)_linle專場
這種題目有點巧看你隨機數選的好不好,就是當前的點和一個無窮遠的一個點組成一條線段,然後判斷這條線段與邊是否有交點
首先與頂點相交不算(這個就看你選的隨機數了,選的好就是沒有,選的不好就是有,不過也可以多試幾次)
而且、如果交點個數是奇數那麼在內部,否則在外部
#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>using namespace std;#define eps 1e-8struct point{ double x; double y;}po[10000],temp;double multi(point p0, point p1, point p2)//j計算差乘{ return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);}bool across(point s1,point e1,point s2,point e2)//判斷線段是否相交(非規範相交){ return multi(s1,e1,s2)*multi(s1,e1,e2) < -eps&& multi(s2,e2,s1)*multi(s2,e2,e1) < -eps;}int main(){ int n,t; int i,j,k; int count; point temp1; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) scanf("%lf%lf",&po[i].x,&po[i].y); scanf("%d",&t); while(t--) { count=0; scanf("%lf%lf",&temp.x,&temp.y); temp1=temp; temp1.x+=100008; temp1.y+=98430; po[i]=po[0]; for(i=0;i<n;i++) if(across(temp,temp1,po[i],po[i+1])) count++; if(count==0 || count%2==0) printf("No\n"); else printf("Yes\n"); } } return 0;}