[コードテスト]BJ 1002号カッターホルダー-C+,PYTHON
に質問
チョ・ギュヒョンとペク・スンファンはタレットで働いている職員だ.しかし存在感がないため、人口を占めていない.次はチョ・ギュヒョンとペク・スンファンの写真だ.
李ソクウォンは、チョ・ギュヒョンとペク・スンファンに相手のマリンの位置を計算するように命令した.趙圭賢と白勝煥はそれぞれ自分のターンテーブルの位置から現在の敵までの距離を計算した.
曹圭賢の座標(x 1,y 1)と白勝煥の座標(x 2,y 2)が与えられ、曹圭賢が計算した劉在明との距離r 1と白勝煥が計算した劉在明の距離r 2が与えられた場合、プログラム出力に劉在明の座標数があるようにしてください.
✔入力
第1行は、試験例の個数Tを与える.各テストケースは次のとおりです.
1行はx 1,y 1,r 1,x 2,y 2,r 2を与える.x 1,y 1,x 2,y 2は−1000以上、10000以下の整数、r 1,r 2は10000以下の自然数である.
✔出力
各テストボックスは、劉在明の位置がある可能性のある数を出力します.劉在明が存在する可能性のある位置の個数が無限大であれば−1を出力する.
💖問題を解く
2円の交点の個数の問題を求めます.X 1は、距離Y 1がr 1に等しい点が中心(x 1,y 1)、半径r 1の円である.x 2,y 2も同じです.この2つの円の交点の個数を求めるのはこの問題の核心である.2つの円の中心距離dを求めます
1)2つの円が重なり、無数の頂点がある.
2)外部接続には頂点があります.
3)頂点を内接する.
4)内部に円が含まれ、頂点が存在しない場合.
5)2時に会う時
6)d遠すぎて会えない
上記6つの場合について、頂点の個数を求めて出力する.
💖C++コード
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
int main()
{
int n;
vector <int> x1;
vector <int> y1;
vector <int> r1;
vector <int> x2;
vector <int> y2;
vector <int> r2;
vector <int> answer;
float d; //점과 점 사이 거리
int r;
cin >> n;
for (int i = 0; i < n; i++) {
int x_1, y_1, r_1, x_2, y_2, r_2;
cin >> x_1 >> y_1 >> r_1 >> x_2 >> y_2 >> r_2;
x1.push_back(x_1);
y1.push_back(y_1);
r1.push_back(r_1);
x2.push_back(x_2);
y2.push_back(y_2);
r2.push_back(r_2);
}
for (int i = 0; i < n; i++) {
d = sqrt(pow(x1[i] - x2[i], 2) + pow(y1[i] - y2[i], 2));
r = r1[i] + r2[i];
if (r1[i] == r2[i] && x1[i] == x2[i] && y1[i] == y2[i]) {// 원이 일치하는 경우
answer.push_back(-1);
}
else if (r == d ) { // 한점에서 원이 외접한다.
answer.push_back(1);
}
else if (r > d) {
if (r2[i] == r1[i]+d || r1[i]==r2[i]+d) //원이 한점에서 내접
answer.push_back(1);
else if (d+r1[i] < r2[i] || d +r2[i]< r1[i]) // 원이 내부에서 만나지 않음
answer.push_back(0);
else //원이 2점에서 접함
answer.push_back(2);
}
else if (r < d) { //원이 만나지 않음
answer.push_back(0);
}
}
for (int i = 0; i < answer.size(); i++) {
cout << answer[i] << '\n';
}
return 0;
}
💖Pythonコード
import math
n = int(input())
x1 = []
y1 = []
r1 = []
x2 = []
y2 = []
r2 = []
for i in range(n):
a,b,c,d,e,f =map(int, input().split())
x1.append(a)
y1.append(b)
r1.append(c)
x2.append(d)
y2.append(e)
r2.append(f)
answer = []
for i in range(n):
d = math.sqrt(pow(x1[i]-x2[i],2)+pow(y1[i]-y2[i],2))
r= r1[i]+r2[i]
if r1[i] == r2[i] and x1[i]==x2[i] and y1[i]== y2[i]:
answer.append(-1)
elif r == d:
answer.append(1)
elif r > d:
if r2[i] == r1[i]+d or r1[i] == r2[i]+d :
answer.append(1)
elif d+r1[i]< r2[i] or d+r2[i]<r1[i]:
answer.append(0)
else:
answer.append(2)
elif r < d:
answer.append(0)
for i in range(n):
print(answer[i])
Reference
この問題について([コードテスト]BJ 1002号カッターホルダー-C+,PYTHON), 我々は、より多くの情報をここで見つけました https://velog.io/@secdoc/코딩테스트-BJ1002번-터렛-Cテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol