点集矩阵

试题 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值