P2313 [HNOI2005]トムのゲーム
タイトル説明
トムは落ち着きのない子であり、そして今日の彼は突然関心にコンパスと定規。そこで彼は大きな、大きな白い紙の上に四角形や円の多くを描くようになりました。塗装塗装、私はそれが彼のポップコーンはポップコーンのマルチ種類には、白い紙を振りかけてしまいますと信じています。トムはポップコーンがポイントのように見える他の人が外にいる間、いくつかのポイントは、長方形や白い紙の上の円の内側に落ちました。今、少年は、各長方形または内側の円のポイントの数をカウントし始めました。結局のところ、トムはちょうど子供だった、との点、長方形や円形と非常に。だから、トムはしばらくの間、数え切れないほど多数あるので、それは助けをあなたに賢明です。あなたの仕事である:(長方形または円形)Nパターンの後、所与の面上のM点は、長方形または円形の内部の各点は、(ここで座標軸に矩形の平行の側面を想定)方法を決定します。
入力形式
INPUT.TXTファイルからデータを読み取り、Nは、パターン(長方形または円形)の数を表す正の整数N及びMの最初の二つの行為のファイルは、Mポイントの数を表します。次のパターンのN行のそれぞれの説明は、特に、I 1 +最初の行は、i番目のパターンです。文字「R」は、それがその後(それぞれ4つの実数X1、Y1、X2、Y2、長方形の角の頂点を表す座標の対を有し、パターンが矩形であることを示す第1、手紙、 x1、y1)と(x2、y2)と、文字が「C」場合には、その後3つの実数値xを有し、パターンは円形であることを示し、Y、R(x、y)に円を表します半径rの円。最後の行のMは、各点の説明であり、各ラインは、2つの実数x、yを持つことになり、座標点(x、y)として表しました。
出力フォーマット
OUTPUT.TXT出力ファイルがM行を含み、各行は、パターンの境界上の点は、我々はこの点ではないと信じているとき整数内部パターンポイント(のi番目の数はi番目の行を表す整数であります内部グラフィックス)。
サンプル入力と出力
入力#1
3 4
R 1.015 0.750 5.000 4.000
C 6.000 5.000 2.020
R 6.500 7.200 7.800 9.200
3.500 2.500
4.995 3.990
2.300 8.150
6.900 8.000
出力#1
1
2
0
1
説明/ヒント
データの100%に、\(N、M \ル500 \)
[思考]
数理基礎+列挙
これでパターンの数地点検索
トピックは非常に暴力を、
唯一の500メートルの範囲を見て、nは
そのポイントそれぞれを列挙することができます
比較して行くと、各グラフの範囲する
範囲内であればすることは
、カウンタカウントし
た場合あなたがたはジャンプしないでしょう
、各列挙グラフィックスが完了するまで
、カウンタの出力は、この時間は
、この時点タスクが完了します
上記は一般的な考え方である
私は、今マニューシャを見てみましょう
それの輸入に従事するには?
ストレージ構造では!
しかし、これら二つの状況ああ?!次の2つの構造体を開くしようとしています!
完全不必要な、あなたは構造開い
acioiの内側に配置され、格納された文字X1、X2、Y1、Y2の整形を
rは形成に使用されるacioi 4つの変数である場合いるので
店2対角の頂点を座標
acioi cは次の3つの内部でのみ使用されている場合
、X1中心のx座標であり、Y 1は、y座標の中心であり、
x2は円の半径である
。注:私はこの取引は単なる個人的な好みであるように!それは簡単に見えます!より良い何そのうちのいくつかがあるどのくらいのスペースを検討していません
そして、内部の特定のグラフィックかどうかを判断するためにあなたを伝える
ことが長方形である場合、その後、
その限りXあなたがポイントとyは、x> X1、Y> Y1、満足として 、X <X 2、Y <Y2のか、X <X1を満たす、Y < Y1、X> X 2、Y> y2は
、他の左上の点の左下点の座標点であり
、それは円形である場合
、このプロセスは、各方向のため、円、非常に良好であること長さが同じである
R&LT半径(すなわち、構造体X2)の両方
この点中心に2つの式の距離との間の距離で得られた
比較の半径および
それがこの範囲内半径位置よりも小さい場合
と、その逆アウト
注:float型または二重開きます!
ヒント:二点間の距離が等しくなる(\ \のSQRT {(X1- X2)^ 2 +(Y1 - Y2)を^ 2} \)
[完了コード】
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int Max = 505;
struct node
{
char acioi;
double x1,y1;
double x2,y2;
}a[Max];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;++ i)
{
cin >> a[i].acioi;
if(a[i].acioi == 'r')
cin >> a[i].x1 >> a[i].y1 >> a[i].x2 >> a[i].y2;
else
cin >> a[i].x1 >> a[i].y1 >> a[i].x2;
}
double x,y;
for(int i = 1;i <= m;++ i)
{
cin >> x >> y;
int js = 0;
for(int j = 1;j <= n;++ j)
{
if(a[j].acioi == 'r')
{
if((a[j].x1 > x && a[j].y1 > y && a[j].x2 < x && a[j].y2 < y) || (a[j].x1 < x && a[j].y1 < y && a[j].x2 > x && a[j].y2 > y) )
js ++;
}
else
{
if( sqrt((a[j].x1 - x) * (a[j].x1 - x) + (a[j].y1 - y) * (a[j].y1 - y)) < a[j].x2)
js ++;
}
}
cout << js << endl;
}
return 0;
}