已知平面上若干个点的坐标。需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数)。
来源:互联网 发布:dw软件代码 编辑:程序博客网 时间:2024/05/19 15:39
/* *已知平面上若干个点的坐标。需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数)。比如有4个点:a,b,c,d,则平均距离是指:ab, ac, ad, bc, bd, cd 这6个距离的平均值。每个点的坐标表示为:横坐标,纵坐标坐标的取值范围是:1~1000所有点的坐标记录在in.txt中,请读入该文件,然后计算。注意:我们测试您的程序的时候,in.txt 可能会很大,比如包含上万条记录。举例:如果,in.txt 内的值为:10,1020,2080,5010,2020,10则程序应该输出:11.38 */import java.io.BufferedReader;import java.io.FileInputStream;import java.io.InputStreamReader;import java.util.List;import java.util.Vector;// 代表一个点class PP {public int x;public int y;public String toString() {return x + "," + y;}public PP(int x, int y) {this.x = x;this.y = y;}}class RR {double x1;double y1;double x2;double y2;public RR() {}public RR(double x1, double y1, double x2, double y2) {this.x1 = x1;this.y1 = y1;this.x2 = x2;this.y2 = y2;}boolean isIn(PP p) {return (x1 < p.x && p.x < x2 && y1 < p.y && p.y < y2);}}public class T07 {public static double f(List<PP> lst, RR r) {// lst:当前要处理的点,r:当前区域if (lst.size() < 4)return 10000; // 代表很远if (lst.size() < 13) {// 测试中所有13中选4的组合double min = 10000;for (int i = 0; i < lst.size(); i++)for (int j = i + 1; j < lst.size(); j++)for (int k = j + 1; k < lst.size(); k++)for (int m = k + 1; m < lst.size(); m++) {double d = distance(lst.get(i), lst.get(j),lst.get(k), lst.get(m));if (d < min)min = d;}return min;}// 缩小边界double x1a = r.x2;double x2a = r.x1;double y1a = r.y2;double y2a = r.y1;for (int i = 0; i < lst.size(); i++) {PP p = lst.get(i);if (p.x < x1a)x1a = p.x;if (p.x > x2a)x2a = p.x;if (p.y < y1a)y1a = p.y;if (p.y > y2a)y2a = p.y;}r.x1 = x1a;r.x2 = x2a;r.y1 = y1a;r.y2 = y2a;// 拆分lst 为4块,重叠4个区域RR r1 = new RR();RR r2 = new RR();RR r3 = new RR();RR r4 = new RR();r1.x1 = r.x1;r1.y1 = r.y1;r1.x2 = r.x1 * 0.25 + r.x2 * 0.75; // 0.75*(x2-x1) + x1r1.y2 = r.y1 * 0.25 + r.y2 * 0.75;r2.x1 = r.x1 * 0.75 + r.x2 * 0.25; // 0.25*(x2-x1) + x1r2.y1 = r.y1 * 0.75 + r.y2 * 0.25;r2.x2 = r.x2;r2.y2 = r.y2;r3.x1 = r.x1;r3.y1 = r.y1 * 0.75 + r.y2 * 0.25;r3.x2 = r.x1 * 0.25 + r.x2 * 0.75;r3.y2 = r.y2;r4.x1 = r.x1 * 0.75 + r.x2 * 0.25;r4.y1 = r.y1;r4.x2 = r.x2;r4.y2 = r.y1 * 0.25 + r.y2 * 0.75;List<PP> t1 = new Vector<PP>();List<PP> t2 = new Vector<PP>();List<PP> t3 = new Vector<PP>();List<PP> t4 = new Vector<PP>();// isIn(p)判断是否在该矩形中for (int i = 0; i < lst.size(); i++) {PP p = lst.get(i);if (r1.isIn(p))t1.add(p);if (r2.isIn(p))t2.add(p);if (r3.isIn(p))t3.add(p);if (r4.isIn(p))t4.add(p);}// 递归double d1 = f(t1, r1);double d2 = f(t2, r2);double d3 = f(t3, r3);double d4 = f(t4, r4);double d = d1;if (d2 < d)d = d2;if (d3 < d)d = d3;if (d4 < d)d = d4;return d;}// 计算 4个点间平均距离public static double distance(PP a,PP b,PP c,PP d){double dis = (distance(a,b) + distance(a,c) + distance(a,d) +distance(b,c) + distance(b,d) + distance(c,d)) / 6.0;return dis;}// 求两个点的距离public static double distance(PP a, PP b){double dx = a.x - b.x;double dy = a.y - b.y;return Math.sqrt(dx*dx + dy*dy);}// 读入文件,填入List中public static List<PP> readPoints(String fname)throws Exception{BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fname)));List<PP> lst = new Vector<PP>();for(;;){String s = br.readLine();if(s==null) break;String[] ss = s.split(",");PP a = new PP(0,0);a.x = Integer.parseInt(ss[0]);a.y = Integer.parseInt(ss[1]);lst.add(a);}br.close();return lst;}public static void main(String[] args) throws Exception {List<PP> lst = readPoints("in.txt");double x = f(lst, new RR(0, 0, 1000, 1000));System.out.printf("%.2f",x);}}
运行结果:
11.38
- 已知平面上若干个点的坐标。需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数)。
- 最近距离 已知平面上的若干点的位置,存入一个List中。现在需要计算所有这些点中, 距离最近的两个点间的最小距离。请补全缺失的代码。
- 最近距离 已知平面上的若干点的位置,存入一个List中。现在需要计算所有这些点中,距离最近的两个点间的最小距离。
- 最近距离 已知平面上的若干点的位置,存入一个List中。现在需要计算所有这些点中,距离最近的两个点间的最小距离
- [算法] 已知在平面坐标系内有N个点,求离开给定坐标距离最近的10个点
- java中四舍五入保留两位小数的方法
- 保留四舍五入后的两位小数
- js四舍五入保留2位小数的位数。
- PHP数值的保留2位小数和四舍五入
- 计算两平面坐标点的距离
- 在百度地图API开发中已知两个点之间的经纬度坐标计算其距离
- 在百度地图API开发中已知两个点之间的经纬度坐标计算其距离
- 题意:给10^5个点的坐标,求出最小的两个点之间的距离
- 四舍五入保留两位小数的四种方法
- 实现浮点数的四舍五入RoundOff,保留几位小数
- java:double四舍五入并保留两位小数的方法
- double四舍五入并保留两位小数的方法
- 对于javascript四舍五入保留多少位小数的问题
- 继承的约束:构造器不可调用被覆盖的方法
- UVa 10562 - Undraw the Trees//遍历or递归
- IT职场规划与学习方法
- 最近一直忙
- android中获取即时天气
- 已知平面上若干个点的坐标。需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数)。
- 路由器与猫的区别
- Java GUI编程中AWT/swing/SWT的优缺点
- “invalid byte 1 of 1-byte UTF-8 sequence”异常
- Qt整体框架浅析(二) -信号机制
- 千里之行始于足下
- Android 四大组件学习之activity的四种加载模式介绍
- Java中如何向系统剪贴板写入富文本
- Android软件开发之ListView 详解