[コードテスト]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])
  • で入力した入力値をintに変換するにはmap(int,input()を入力します.split())
  • sqrt,powはimport math