Hướng dẫn giải của [200 đề thầy Đức] Bài 39: Hình vuông


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Hướng dẫn giải

Hai đỉnh đã cho có thể nằm trên một cạnh (cùng x hoặc cùng y), trên một đường chéo, hoặc không liên quan. Nếu cùng x hoặc cùng y thì cạnh có độ dài d bằng khoảng cách giữa hai đỉnh; đỉnh còn lại được suy ra bằng cách quay vector cạnh 90 độ. Nếu hai đỉnh nằm trên đường chéo thì hai đỉnh còn lại là giao của các đường thẳng qua hai đỉnh đã cho.

Sub 1: Công thức theo từng trường hợp — ~O(1)~

Bài này chỉ là phân tích trường hợp, không có cách vét cạn nào khác đáng kể nên chỉ viết 1 sub. Các trường hợp:

  • x1 = x2: đỉnh còn lại là (x1 - dy, y1) và (x2 - dy, y2), với dy = y2 - y1.
  • y1 = y2: đỉnh còn lại là (x1, y1 - dx) và (x2, y2 - dx), với dx = x2 - x1.
  • |dx| = |dy| (đường chéo): đỉnh còn lại là (x1, y2) và (x2, y1).
  • Còn lại: in -1.

Đạt 74/74 test.

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    long long x1, y1, x2, y2;
    cin >> x1 >> y1 >> x2 >> y2;
    long long dx = x2 - x1, dy = y2 - y1;
    if (x1 == x2) {
        // Hai dinh nam tren mot canh doc: quay vector (0, dy) mot goc 90 do
        // de duoc hai dinh con lai: (x1 - dy, y1), (x2 - dy, y2)
        cout << x1 - dy << " " << y1 << " " << x2 - dy << " " << y2 << "\n";
    } else if (y1 == y2) {
        // Hai dinh nam tren mot canh ngang: (x1, y1 - dx), (x2, y2 - dx)
        cout << x1 << " " << y1 - dx << " " << x2 << " " << y2 - dx << "\n";
    } else if (llabs(dx) == llabs(dy)) {
        // Hai dinh nam tren duong cheo: hai dinh con lai la (x1, y2) va (x2, y1)
        cout << x1 << " " << y2 << " " << x2 << " " << y1 << "\n";
    } else {
        cout << -1 << "\n";
    }
    return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.