最小长方形

来源:互联网 发布:高中数学软件手机版 编辑:程序博客网 时间:2024/04/29 08:55

题目:

给定一系列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 5623 5613 100 012 340 00 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;//本组数据输入结束}elseinput_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>

0 0