CF749B Parallelogram is Back 題解
阿新 • • 發佈:2021-12-21
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); }