这段c++的两个空该怎么填呢?

qiugui0557 2014-05-15 06:49:07
是一题程序填空题,剩下两个空我觉得是填写:排出 i 和 j 两个点,但不知道怎么表达,希望大家帮忙!
下面的程序用枚举法解决如下问题,请填空。
平面上的一个矩形,如果其边平行于坐标轴,我们就称其为“标准矩形”。给定不重复的 n 个整点(横、纵坐标都是整数的点),求从这n个点中任取4点作为顶点所构成的四边形中,有多少个是标准矩形。

输入数据:
第一行是点的数目
其后每一行都代表一个点,由两个整数表示,第一个是x坐标,第二个是y坐标

输出要求:
输出标准矩形的数目

输入样例:
6
2 3
2 5
4 5
4 4
2 4
4 3
输出样例:
3

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Point {
int x;
int y;
Point(int x_, int y_) :x(x_), y(y_) { }
};
bool operator < (const Point & p1, const Point & p2)
{
if (p1.y < p2.y)
return true;
else if (p1.y == p2.y)
return p1.x < p2.x;
else
return false;
}
int main()
{
int t;
int x, y;
cin >> t;
vector<Point> v;
while (t--) {
cin >> x >> y;
v.push_back(Point(x, y));
}
sort(v.begin(),v.end());
vector<Point>::iterator i, j;
int nTotalNum = 0;
for (i = v.begin(); i < v.end() - 1; i++)
for (j = i+1 ; j < v.end() ; j++) {
if (binary_search(v.begin(), v.end(), Point(j->x, i->y)) &&
binary_search(v.begin(), v.end(), Point(i->x, j->y)) &&
____________________________________________ &&
______________________________________________)
nTotalNum++;
}
cout << nTotalNum;
return 0;

}
...全文
511 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhumawinnner 2016-04-14
  • 打赏
  • 举报
回复
cout的结果要除以2,因为同样的矩形被算进去两次。
hust_wangyajun 2014-05-16
  • 打赏
  • 举报
回复
1 i->x != j->x; //排除二者在一条横线上 2 i->y != j->y; //排除二者在一条纵线上
kivien 2014-05-16
  • 打赏
  • 举报
回复
我觉得“排除两点在同一条直线上”其实就是“前两个条件找到的点都不应该等于j点” 可能是实力问题,我怎么看不出来上面的意思已经实现
引用 3 楼 u012248381 的回复:
[quote=引用 1 楼 u012565501 的回复:] 第一点要排除:两点重合; 第二点要排除:两点在同一直线上(x或y相等)。
我没太清楚你说的意思,我觉得“排除两点在同一条直线上”其实就是“前两个条件找到的点都不应该等于j点”,我知道表达的清楚吗,所以目前没想到怎么写这两句代码[/quote]
kivien 2014-05-16
  • 打赏
  • 举报
回复
你确定吗,昨晚我走了遍,似乎不是哦
引用 4 楼 u012248381 的回复:
[quote=引用 2 楼 u012565501 的回复:] 其实我看不懂这里 for (i = v.begin(); i < v.end() - 1; i++) 最后一个点和倒数第二个点是不是还没匹配?
最后一个和倒数第二个是不是不用匹配了,因为这两个点都在前面匹配出的矩形中满足了。[/quote]
qiugui0557 2014-05-16
  • 打赏
  • 举报
回复
引用 7 楼 hust_wangyajun 的回复:
1 i->x != j->x; //排除二者在一条横线上 2 i->y != j->y; //排除二者在一条纵线上
谢谢 对对对 原来怎么死活就没想出来排除的方法呢,脑子锈了... 但是 运行结果好像有误 给的示例 运行后结果是6...
qiugui0557 2014-05-16
  • 打赏
  • 举报
回复
引用 2 楼 u012565501 的回复:
其实我看不懂这里 for (i = v.begin(); i < v.end() - 1; i++) 最后一个点和倒数第二个点是不是还没匹配?
最后一个和倒数第二个是不是不用匹配了,因为这两个点都在前面匹配出的矩形中满足了。
qiugui0557 2014-05-16
  • 打赏
  • 举报
回复
引用 1 楼 u012565501 的回复:
第一点要排除:两点重合; 第二点要排除:两点在同一直线上(x或y相等)。
我没太清楚你说的意思,我觉得“排除两点在同一条直线上”其实就是“前两个条件找到的点都不应该等于j点”,我知道表达的清楚吗,所以目前没想到怎么写这两句代码
kivien 2014-05-15
  • 打赏
  • 举报
回复
其实我看不懂这里 for (i = v.begin(); i < v.end() - 1; i++) 最后一个点和倒数第二个点是不是还没匹配?
kivien 2014-05-15
  • 打赏
  • 举报
回复
第一点要排除:两点重合; 第二点要排除:两点在同一直线上(x或y相等)。

65,209

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧