题目链接
B. Come Together
题意
输入
输出
思路
可以将B
、C
坐标作A
的变换,将A
平移至原点,然后分情况讨论:
B
、C
两点都在轴上,具体分为同向轴和其他情况B
、C
两点都在象限中,具体分为相同象限、对角象限和相邻象限- 分别位于象限和轴上,具体分为象限与轴共边和其他情况
注意:两个数相乘可能会爆int
示例代码
#include<bits/stdc++.h>using namespace std;#define ll long long
#define int ll
#define pii pair<int, int>
#define all(x) x.begin(),x.end()
#define endl '\n'
#define fer(i, m, n) for(int i = m; i < n; ++i)
#define ferd(i, m, n) for(int i = m; i >= n; --i)
#define inf INT_MAXconst int MOD = 1e9 + 7;
const int N = 2e5 + 2;void solve() {int x1, x2, x3, y1, y2, y3;cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;x2 -= x1, x3 -= x1;y2 -= y1, y3 -= y1;int ans = 0;// 都在轴上if((x2 == 0 || y2 == 0) && (x3 == 0 || y3 ==0)){if(x2 * x3 > 0) // 同向轴ans = min(abs(x2), abs(x3));else if(y2 * y3 > 0) // 同向轴ans = min(abs(y2), abs(y3));else ans = 0;}else if(x2 != 0 && x3 != 0 && y2 != 0 && y3 != 0){// 都在象限上if(x2 * x3 < 0 && y2 * y3 < 0) // 对角ans = 0;else if(x2 * x3 > 0 && y2 * y3 > 0) // 同象限ans = min(abs(x2), abs(x3)) + min(abs(y2), abs(y3));else if(x2 * x3 > 0)ans = min(abs(x2), abs(x3));else ans = min(abs(y2), abs(y3));}else{// 象限 + 轴if(x2 * x3 > 0) ans = min(abs(x2), abs(x3));else if(y2 * y3 > 0) ans = min(abs(y2), abs(y3));else ans = 0;}cout << ans + 1 << '\n';
}signed main() {ios::sync_with_stdio(false);cin.tie(nullptr);int T = 1;cin >> T;while(T--) {solve();}return 0;
}