[標準C++]1064平行四角形


質問する


平行四角形は、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つの最大のミスで苦労したので、整理してみます.
  • C++の除算演算子(/)両方の演算子が整数の場合、残りは破棄されます.
  • この間intに入力値を保存しましたが、これらをdoublに変換する以上、最初からdoublを得るべきです.
  • scanfで整数を倍にする場合は、%fではなく%lfをとる必要があります.
  • すなわちdoubleに格納する場合は、%lfを使用する必要があります.
    勾配値を3つの点
  • の位置に比較し、直線であるかどうかを確認します.
    割引で比較すべきです.
  • 2点の直線の傾きで計算エラーが発生しました.

    こうして修正して提出しました...間違いだと言う
    最終的に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);
    	}
    }