[標準C++]1064平行四角形
11635 ワード
質問する
平行四角形は、2つの平行エッジの四角形です.3つの異なる点を与えます.A(xA,yA), B(xB,yB), C(xC,yC)
このとき、適当に点Dを探して、4つの点で平行四角形にすればよい.このとき,Dは複数出現する可能性がある.
作成したすべての長方形の最大周長と最小周長の違いを出力するプログラムを作成します.作成できる平行四角形がない場合は、-1が出力されます.
入力
最初の行はxAyAxByBxCyCを与えます.いずれも、節価が5000以下の整数です.
しゅつりょく
最初の行に問題の答えを出力します.絶対/相対誤差は10-9の間で許容される.
https://www.acmicpc.net/problem/1064
平行四角形の周長が3つの点からなる細い直線の長さを求める.
この3つの中から2つ(2つ合x 2)を周長として選択する.
まず、平行四角形を作成できない場合は、
3点が一直線上にあるとき.
3つの最大のミスで苦労したので、整理してみます.
勾配値を3つの点
割引で比較すべきです.
こうして修正して提出しました...間違いだと言う
最終的にfor文を放棄し,水気で周長をperimer配列に組み込み,C++のmax,min関数を用いて出力した.
数字の演算にあまり詳しくないようです.
#define _CRT_SECURE_NO_WARNINGS //scanf오류 없앰
#include <bits/stdc++.h>
using namespace std;
int main(void) {
double x1, y1, x2, y2, x3, y3;
scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3);
//두직선의 기울기가 같으면 한직선상이므로 -1출력
if ((abs(y2 - y1) / abs(x2 - x1)) == (abs(y3 - y2) / abs(x3 - x2))) {
printf("-1.0");
}
else {
double lines[3];
lines[0] = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); //2 ,1
lines[1] = sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)); //3, 1
lines[2] = sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2)); //3, 2
double perimeters[] = { lines[0] * 2 + lines[1] * 2,
lines[1] * 2 + lines[2] * 2,
lines[2] * 2 + lines[0] * 2 };
double maxPerimeter = 0.0, minPerimeter = 0.0;
maxPerimeter = max(perimeters[0], max(perimeters[1], perimeters[2]));
minPerimeter = min(perimeters[0], min(perimeters[1], perimeters[2]));
printf("%.16f", maxPerimeter - minPerimeter);
}
}
Reference
この問題について([標準C++]1064平行四角形), 我々は、より多くの情報をここで見つけました https://velog.io/@cldhfleks2/1064テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol