试题 2 考虑图 1a, 2a, 3a中的点集。将这些点作为矩形的顶点,可以构成如图 1b, 2b, 3b 中
所示的诸多矩形。这些矩形的边都须为水平边或垂直边。而图4 所示的点集不能构成任何矩
形。你的任务是在给定的点集中找出所有可能构成的矩形。
输入 :输入文件包含一个或多个点集。此文件以数字 0 结束。每个点集由一个整数N 开始,
表示点集中点的数目,后续的N行描述了所有的N个点。每个点按如下方式描述:一个大
写字母(唯一标识每个点)、一个空格、水平坐标、一个空格、垂直坐标。在每个点集中,点
标识按字母顺序排列。注意,由于点集中每个点用大写字母标识,故一个点集最多包含 26
个点。所有点的坐标值非负且小于 50。点集中的每个点是唯一的。
输出 :每个点集的输出由字符串“Point set”开始,后跟一个空格、点集序号和冒号。如果
没有找到任何矩形,冒号后应显示“No rectangles”。否则,把找到的矩形另起一行依次列出。
每个矩形用其四个顶点的标识符表示,从左上角的顶点开始,按顺时针顺序给出,即依次为:
左上角、右上角、右下角、左下角。每个矩形后跟一个空格。每一行最多列举十个矩形。行
尾没有空格。找出的若干矩形须按字母顺序排列。
#include<iostream>
#include<fstream>
#include<vector>
#include<set>
#include<string>
using namespace std;
struct point
{
char ch;//字符[A,Z]
int px;//水平坐标[0,50)
int py;//垂直坐标[0,50)
};//点结构体定义
void main()
{
int setcount=0;//第几个点集
ifstream stream("input.txt");
bool bo=true;
point setpoint;
string str;
vector<point>v;
set<string>s;
while(bo)
{
int pointnum;//点集中点的数目
stream>>pointnum;
if(pointnum==0){ bo=false; }
else
{
setcount++;
for(int i=1;i<=pointnum;i++)
{
stream>>setpoint.ch>>setpoint.px>>setpoint.py;
v.push_back(setpoint);
}
for (int i1=0; i1<pointnum; i1++)
{
for (int i2=0; i2<pointnum; i2++)
{
if (i1==i2) continue;
for (int i3=0; i3<pointnum; i3++)
{
if (i1==i3) continue;
if (i2==i3) continue;
for (int i4=0; i4<pointnum; i4++)
{
if (i1==i4||i2==i4||i3==i4) continue;
else
{
if(v[i1].px==v[i4].px&&v[i2].px==v[i3].px&&
v[i1].py==v[i2].py&&v[i3].py==v[i4].py&&
v[i1].px<v[i2].px&&v[i1].py>v[i4].py)//判断四点能否构成矩形
{
char array[5];
array[0]=v[i1].ch;
array[1]=v[i2].ch;
array[2]=v[i3].ch;
array[3]=v[i4].ch;
array[4]=0;
str=array;
s.insert(str);
}
}
}//i4
}//i3
}//i2
} //i1
if(s.empty()){ cout<<"Point set "<<setcount<<":"<<"No rectangles"<<endl; }
else
{
set<string>::iterator p=s.begin();
int m=0;
cout<<"Point set "<<setcount<<":";
for(p;p!=s.end();p++)
{
if(m%10==0){ cout<<'/n'<<*p<<" ";m++;}
else{ cout<<*p<<" ";m++;}
}
cout<<endl;
}
}//else
v.clear();
s.clear();
}//while
}//main