三平方の定理を思い出そう!
問題概要
座標平面上の 3 個の格子点 が与えられる。
これら 3 点 が直角三角形をなすかどうかを判定せよ。
制約
- 座標値は -1000 以上 1000 以下
考えたこと
3 点 A, B, C が直角三角形をなす条件は
のいずれかを満たすことである。もしくは、 のうちの最大値がわかっていれば、判定をより容易にできる。たとえば、 が最大であれば、直角三角形をなす条件は
と書ける。
今回の問題の場合、まずは の値を求めよう。そして、上の式を満たすかどうかを check すればよい。
おまけ: の求め方
一般に 2 点 を結ぶ線分の長さの 2 乗は
によって求められる。
コード
#include <bits/stdc++.h> using namespace std; int main() { long long xa, ya, xb, yb, xc, yc; cin >> xa >> ya >> xb >> yb >> xc >> yc; vector<long long> A(3); A[0] = (xa - xb) * (xa - xb) + (ya - yb) * (ya - yb); A[1] = (xb - xc) * (xb - xc) + (yb - yc) * (yb - yc); A[2] = (xc - xa) * (xc - xa) + (yc - ya) * (yc - ya); sort(A.begin(), A.end()); if (A[2] == A[0] + A[1]) cout << "Yes" << endl; else cout << "No" << endl; }