給定多組二維平面點坐標 (x, y),|x|,|y| < 2^31。每組以 (0,0) 結束(不計入點集),整個輸入以空點集 (0,0) 結束。求包含所有點的最小軸平行長方形,輸出左下角和右上角坐標。
只需維護四個極值:
長方形即為 (minX, minY) 到 (maxX, maxY)。
題目輸入格式有陷阱:
while (cin >> x >> y, x || y) 處理單組,外層同理#include <iostream>
#include <algorithm>
#include <climits>
using namespace std;
int main() {
long long x, y;
// 讀取第一個點判斷是否結束整個輸入
if (!(cin >> x >> y)) return 0;
if (x == 0 && y == 0) return 0; // 空點集,直接結束
// 初始化極值
long long minX = x, maxX = x;
long long minY = y, maxY = y;
// 讀取同一測試用例的剩餘點
while (cin >> x >> y, x || y) {
minX = min(minX, x);
maxX = max(maxX, x);
minY = min(minY, y);
maxY = max(maxY, y);
}
// 輸出第一組結果
cout << minX << ' ' << minY << ' ' << maxX << ' ' << maxY << '\n';
// 處理後續測試用例
while (cin >> x >> y) {
if (x == 0 && y == 0) break; // 空點集,結束所有輸入
minX = maxX = x;
minY = maxY = y;
while (cin >> x >> y, x || y) {
minX = min(minX, x);
maxX = max(maxX, x);
minY = min(minY, y);
maxY = max(maxY, y);
}
cout << minX << ' ' << minY << ' ' << maxX << ' ' << maxY << '\n';
}
return 0;
}
輸入: 12 56 23 56 13 10 0 0 12 34 0 0 0 0 處理: 第1組:(12,56), (23,56), (13,10) → minX=12, maxX=23, minY=10, maxY=56 第2組:(12,34) → minX=maxX=12, minY=maxY=34 輸出: 12 10 23 56 12 34 12 34
while(cin>>x>>y && (x||y)) 會導致讀到 (0,0) 時提前退出外層循環long long (64位)