1. 程式人生 > 其它 >CF749B Parallelogram is Back 題解

CF749B Parallelogram is Back 題解

CF749B Parallelogram is Back 題解

Content

給出平行四邊形的三個頂點 \((x_1,y_1),(x_2,y_2),(x_3,y_3)\),求出所有可能的第四個頂點。

資料範圍:\(\forall i\in[1,3],-1000\leqslant x_i,y_i\leqslant 1000\)

Solution

這題可以通過平行四邊形的一個性質輕鬆搞定——平行四邊形的對角線互相平分

啥啥啥?你還不知道什麼是平行四邊形?

因為太佔空間,去這裡看吧qwq。

那麼用這個有什麼用呢?

我們都知道,一條線段 \(AB\) 的中點計算公式是 \((\dfrac{x_A+x_B}{2},\dfrac{y_A+y_B}{2})\),那麼我們來看到下面這個平行四邊形:

那麼,我們通過上面這個平行四邊形的性質可以得到,\(AC\)\(BD\) 的中點是同一個點。那麼我們就有:

\[\begin{cases}\dfrac{x_A+x_C}{2}=\dfrac{x_B+x_D}{2}&...(1)\\\dfrac{y_A+y_C}{2}=\dfrac{y_B+y_D}{2}&...(2)\end{cases} \]

\((1)\) 式和 \((2)\) 式分別都乘上 \(2\)可以得到:\(x_A+x_C=x_B+x_D,y_A+y_C=y_B=y_D\)

所以,現在假設 \(A,B,C\) 三個點為題目中的已知點,那麼第四個點 \(D\)

可以有以下幾種:

我們可以通過計算得到:

\(D_1(x_A+x_C-x_B,y_A+y_C-y_B)\)
\(D_2(x_A+x_B-x_C,y_A+y_B-y_C)\)
\(D_3(x_B+x_C-x_A,y_B+y_C-y_A)\)

我們可以發現,有且僅有以上這三個點符合要求。因此,滿足點的個數為 \(3\),座標直接按照上面的公式輸出即可(順序可以任意)。

Code

#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;

int x1, y1, x2, y2, x3, y3;

int main() {
	scanf("%d%d%d%d%d%d", &x1, &y1, &x2, &y2, &x3, &y3);
	printf("3\n%d %d\n%d %d\n%d %d", x2 + x3 - x1, y2 + y3 - y1, x1 + x3 - x2, y1 + y3 - y2, x1 + x2 - x3, y1 + y2 - y3);
}