天天看點

HDOJ(HDU) 1859 最小長方形------個人題解

人生第一場ACM比賽(僞)中叫炎龍俠的題目,應該算是一道水題了吧。

題目:

給定一系列2維平面點的坐标(x, y),其中x和y均為整數,要求用一個最小的長方形框将所有點框在内。長方形框的邊分别平行于x和y坐标軸,點落在邊上也算是被框在内。

輸入:

測試輸入包含若幹測試用例,每個測試用例由一系列坐标組成,每對坐标占一行,其中|x|和|y|小于 231;一對0 坐标标志着一個測試用例的結束。注意(0, 0)不作為任何一個測試用例裡面的點。一個沒有點的測試用例标志着整個輸入的結束。

輸出:

對每個測試用例,在1行内輸出2對整數,其間用一個空格隔開。第1對整數是長方形框左下角的坐标,第2對整數是長方形框右上角的坐标。

輸入範例:

12 56

23 56

13 10

0 0

12 34

0 0

0 0

輸出範例:

12 10 23 56

12 34 12 34

思路:既然說在邊上的點也算,那麼最小的矩形一定是穿過至少兩個點的,而且最大的橫坐标、縱坐标和最小的橫坐标、縱坐标一定在那些點的坐标裡,那麼這題也就是隻要求橫縱坐标的最大最小值了。

我的AC代碼:
#include<iostream>
using namespace std;

int main()
{
	int m, n;
	while (cin >> m >> n && m && n)//輸入&結束條件
	{
		int max_x = m, max_y = n, min_x = m, min_y = n;//橫坐标為x,工作表為y,四個變量分别是他它們的最大最小值,初始化為m和n(總不能都是0吧......)
		while (cin >> m >> n && m && n)//輸入&結束條件
		{
			if (m > max_x) max_x = m;//這步下面三步都是為了确定最大最小值的
			if (m < min_x) min_x = m;
			if (n > max_y) max_y = n;
			if (n < min_y) min_y = n;
		}
		cout << min_x << ' ' << min_y << ' ' << max_x << ' ' << max_y << endl;//輸出
	}
}