平行四边形问题

wccmfc123 2010-11-17 02:51:07
数据结构与算法实验题 7.1 平行四边形问题
★实验任务
一天,平行四边形和三角形在公园碰面了。三角形提议说:“咱们两个比本领吧。”
平行四边形:“比就比!”。三角形顶起了一块大石头,稳稳地站在那。平行四边形也把大
石头顶了起来,但一会儿就被压变形了。三角形说:“我的稳定性强吧,如:房顶上的金
字架、支撑照相机的三角架和自行车上的三角架都是按照我不易变形的特点制作的。”平
行四边形听了,顿时茅塞顿开:“我的特点是容易变形,如:公司、学校的伸缩门,就是
按照我的特点做的,有的还利用我互相平分的对角线。”
给出平面上 N 个不同的点的坐标,让你编程计算这些点一共可构成多少个不同的平行
四边形,数据保证任意四点不共线。
★数据输入
输人第一行包括一个正整数N(N<=600),表示点的个数。接下来N行,每行包括两个int型整数,给出每个点的坐标,两个数之间用空格隔开。
★数据输出
输出只有一行,包含一个数,即平行四边形的个数。
输入示例
输出示例
7
-2 -1
8 9
5 7
1 1
4 8
2 0
9 8
6



谁有好办法吗?
...全文
275 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
njwangchuan 2010-11-18
  • 打赏
  • 举报
回复
学习了!
figo1688 2010-11-18
  • 打赏
  • 举报
回复
4L好方法,数学能力强的作用体现出来了
绿色夹克衫 2010-11-18
  • 打赏
  • 举报
回复
确实比我的方法好,n^2*log(n)变成n^2了!

[Quote=引用 4 楼 yaoweijq 的回复:]
http://poj.org/problem?id=1971
跟poj 1971是一样的,
如果四个点能组成平行四边形的话,
那么对角线的中点必定重合,
利用这个来判断。
枚举所有点的中点(直接求和是同样的问题),
然后排序,
对相同坐标的中点进行处理就行
附ac程序java版:
Java code
package com.yaowei.acm.problem_19xx;

……
[/Quote]
yaoweijq 2010-11-18
  • 打赏
  • 举报
回复
http://poj.org/problem?id=1971
跟poj 1971是一样的,
如果四个点能组成平行四边形的话,
那么对角线的中点必定重合,
利用这个来判断。
枚举所有点的中点(直接求和是同样的问题),
然后排序,
对相同坐标的中点进行处理就行
附ac程序java版:
package com.yaowei.acm.problem_19xx;

import java.util.Arrays;
import java.util.Scanner;

public class Problem_1971 {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(System.in);
int caseCount = scanner.nextInt();
scanner.nextLine();
Point[] pArray;
for (int i = 0; i < caseCount; i++) {
int line = scanner.nextInt();
scanner.nextLine();
String s = "";
int result = 0;
long[] x = new long[line];
long[] y = new long[line];
for (int j = 0; j < line; j++) {
x[j] = scanner.nextLong();
y[j] = scanner.nextLong();
scanner.nextLine();
}// 一个case接收完毕
pArray = new Point[line * (line - 1) / 2];
int count = 0;
// 开始计算结果
for (int j = 0; j < line - 1; j++) {
for (int k = j + 1; k < line; k++) {
pArray[count++] = new Point(x[j] + x[k], y[j] + y[k]);
}
}
// 计算结果完毕
if (pArray.length < 2) {
System.out.println(0);
} else {
Arrays.sort(pArray);
long tempx = pArray[0].x;
long tempx1 = 0;
long tempy1 = 0;
long tempy = pArray[0].y;
int tempCount = 1;
for (int k = 1; k < pArray.length; k++) {
tempx1 = pArray[k].x;
tempy1 = pArray[k].y;
if (tempx1 == tempx && tempy1 == tempy) {
tempCount++;
} else {
tempx = tempx1;
tempy = tempy1;
if (tempCount > 1) {
result = result + (tempCount * (tempCount - 1) / 2);
}
tempCount = 1;
// // }
}
}
System.out.println(result);
}
}
}
}

class Point implements Comparable<Point> {
public long x;

public long y;

public Point(long x, long y) {
this.x = x;
this.y = y;
}

public int compareTo(Point p) {
if (this.x < p.x) {
return -1;
}
if (this.x > p.x) {
return 1;
}
if (this.y > p.y) {
return 1;
}
if (this.y < p.y) {
return -1;
}
return 0;
}
}
绿色夹克衫 2010-11-18
  • 打赏
  • 举报
回复
先求出所有点之间的相互连线,然后按照斜率和长度排个序,然后在斜率和长度都相等的情况下,用乘法,可以计算出有多少个平行四边形,不过最后要除2,去掉重复统计的
asmlearn 2010-11-18
  • 打赏
  • 举报
回复
1、穷举法,判断任何两组在平行线上的点组成四边形。
2、排除法:去除已经处理过的点。
somebody 2010-11-17
  • 打赏
  • 举报
回复
先回个,以后来看!

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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