题目:
给定一系列2维平面点的坐标(x, y),其中x和y均为整数,要求用一个最小的长方形框将所有点框在内。长方形框的边分别平行于x和y坐标轴,点落在边上也算是被框在内。
输入:
测试输入包含若干测试用例,每个测试用例由一系列坐标组成,每对坐标(x y) 占一行,其中|x|和|y|小于 1000;一对(0,0) 坐标标志着一个测试用例的结束。注意(0, 0)不作为任何一个测试用例里面的点。一个没有点的测试用例标志着整个输入的结束。
输出:
对每个测试用例,在1行内输出2对整数,其间用一个空格隔开。第1对整数是长方形框左下角的坐标,第2对整数是长方形框右上角的坐标。
如果只是一个点或者一条线,不输出。例如:
12 34
0 0
只是一个点,不是长方形,不输出。
输入:
输出:12 56 23 56 13 10 0 0 12 34 0 0 0 0
12 10 23 56代码:
#include <iostream>
#include <vector>
#include <utility>
using namespace std;
int main()
{
vector<vector<pair<int, int>>> input;//保存输入所有数据
vector<pair<int, int>> input_mem;//保存输入每组顶点数据
pair<int, int> input_line;//保存输入每组数据中的每个点坐标
pair<int, int> zero_line(0, 0);//保存每组数据输入结束符
vector<pair<int, int>> zero_mem;//保存所有数据输入结束符
zero_mem.push_back(zero_line);
while (1)
{
while (1)
{
cin >> input_line.first >> input_line.second;//输入一个顶点坐标
if (input_line == zero_line)//如果输入的为这组数据的结束符,则终止循环,代表本组数据输入结束
{
input_mem.push_back(input_line);//将结束符(0,0)存入本组数据
break;//本组数据输入结束
}
else
input_mem.push_back(input_line);//正常输入顶点数据
}
if (input_mem == zero_mem)//如果所有顶点组数据都输入完毕,则终止输入
break;
input.push_back(input_mem);//正常输入顶点组数据
input_mem.clear();//清空存顶点组数据的中间变量,为下一组数据输入做好准备
}
for (int i = 0; i<input.size(); i++)//对所有输入的顶点组数据
{
if (input[i].size() == 2)//如果当前组只要两个数据,说明只有一个顶点,不输出
continue;
int min_x = input[i][0].first;//保存最小、最大顶点数值
int max_x = input[i][0].first;
int min_y = input[i][0].second;
int max_y = input[i][0].second;
for (int j = 1; j<input[i].size() - 1; j++)//比较当前顶点与最大、最小顶点数值
{
if (input[i][j].first<min_x)//跟新最大、最小顶点数值
{
min_x = input[i][j].first;
}
if (input[i][j].first>max_x)
{
max_x = input[i][j].first;
}
if (input[i][j].second<min_y)
{
min_y = input[i][j].second;
}
if (input[i][j].second>max_y)
{
max_y = input[i][j].second;
}
}
cout << min_x << " " << min_y << " " << max_x << " " << max_y << endl;//每组输出一行
}
return 0;
}<strong>
</strong>