最小长方形 | |
描述: | 给定一系列2维平面点的坐标(x, y),其中x和y均为整数,要求用一个最小的长方形框将所有点框在内。长方形框的边分别平行于x和y坐标轴,点落在边上也算是被框在内。 |
运行时间限制: | 10 Sec |
内存限制: | 128 MByte |
输入: | 测试输入包含若干测试用例,每个测试用例由一系列坐标组成,每对坐标(x y) 占一行,其中|x|和|y|小于 1000;一对(0,0) 坐标标志着一个测试用例的结束。注意(0, 0)不作为任何一个测试用例里面的点。一个没有点的测试用例标志着整个输入的结束。 |
输出: | 对每个测试用例,在1行内输出2对整数,其间用一个空格隔开。第1对整数是长方形框左下角的坐标,第2对整数是长方形框右上角的坐标。 如果只是一个点或者一条线,不输出。例如: 12 34
|
样例输入: | 12 56 23 56 13 10 0 0 12 34 0 0 0 0 |
样例输出: | 12 10 23 56 |
答案提示: | |
假如每个测试用例中所有点数都大于等于2,且所有的点都在一条直线上,当这条直线是水平直线或者垂直直线时,不输出。
但当这条直线既不是水平直线也不是垂直直线时,这时候还是要输出这条斜线的外接长方形的坐标的。
我的代码:
#include<iostream>
using namespace std;
int main()
{
int x,y;
int minvalx,maxvalx,minvaly,maxvaly;
int num;
int flag;
do
{
maxvalx=0;
maxvaly=0;
minvalx=0;
minvaly=0;
num=0;
flag=1;
while(cin>>x>>y)
{
if(x==0&&y==0)
break;
else
num++;//,每个算例输入的点的个数
if(flag)
{
minvalx=maxvalx=x;
minvaly=maxvaly=y;
flag=0;
}
else
{
if(x>maxvalx)
maxvalx=x;
if(x<minvalx)
minvalx=x;
if(y>maxvaly)
maxvaly=y;
if(y<minvaly)
minvaly=y;
}
}
if(minvalx!=maxvalx&&minvaly!=maxvaly)
cout<<minvalx<<" "<<minvaly<<" "
<<maxvalx<<" "<<maxvaly<<endl;
}while(num!=0);//当此次算例符合要求的点数为0,跳出循环
}