java平面_java实现平面点最小距离

已知平面上若干个点的坐标。

需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数)。

比如有4个点:a,b,c,d, 则平均距离是指:ab, ac, ad, bc, bd, cd 这6个距离的平均值。

每个点的坐标表示为:横坐标,纵坐标

坐标的取值范围是:1~1000

所有点的坐标记录在in.txt中,请读入该文件,然后计算。

注意:我们测试您的程序的时候,in.txt 可能会很大,比如包含上万条记录。

举例:

如果,in.txt 内的值为:

10,10

20,20

80,50

10,20

20,10

则程序应该输出:

11.38

请编程,读入in.txt文件,计算并输出4个点平均距离的最小值。

要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。

相关的工程文件不要拷入。

对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;

不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。

锦囊

可以用分治法。

把平面分割成4个区域。

4个区域互相可以重叠,以避免边界问题。

另一个方案:

四个区域不重合,但在所有边界上生成新区域。

总之划分,可以所有问题的规模。

import java.io.*;

import java.util.*;

public class PointDistance

{

static 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;

}

}

static class RR

{

double x1;

double x2;

double y1;

double y2;

boolean isIn(PP p)

{

return (x1 < p.x && p.x < x2 && y1 < p.y && p.y < y2);

}

}

public static double f(List lst, double x1, double x2, double y1, double y2)

{

if(lst.size()<4) return 10000;

if(lst.size()<10)

{

double min = 10000;

for(int i=0; i

for(int j=i+1; j

for(int k=j+1; k

for(int m=k+1; 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 = x2;

double x2a = x1;

double y1a = y2;

double y2a = y1;

for(int i=0; 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;

}

x1 = x1a;

x2 = x2a;

y1 = y1a;

y2 = y2a;

// ²ð·Ölst Ϊ4¿é

RR r1 = new RR();

RR r2 = new RR();

RR r3 = new RR();

RR r4 = new RR();

r1.x1 = x1;

r1.y1 = y1;

r1.x2 = x1 * 0.25 + x2 * 0.75;

r1.y2 = y1 * 0.25 + y2 * 0.75;

r2.x1 = x1 * 0.75 + x2 * 0.25;

r2.y1 = y1 * 0.75 + y2 * 0.25;

r2.x2 = x2;

r2.y2 = y2;

r3.x1 = x1;

r3.y1 = y1 * 0.75 + y2 * 0.25;

r3.x2 = x1 * 0.25 + x2 * 0.75;

r3.y2 = y2;

r4.x1 = x1 * 0.75 + x2 * 0.25;

r4.y1 = y1;

r4.x2 = x2;

r4.y2 = y1 * 0.25 + y2 * 0.75;

List t1 = new Vector();

List t2 = new Vector();

List t3 = new Vector();

List t4 = new Vector();

for(int i=0; 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.x1, r1.x2, r1.y1, r1.y2);

double d2 = f(t2, r2.x1, r2.x2, r2.y1, r2.y2);

double d3 = f(t3, r3.x1, r3.x2, r3.y1, r3.y2);

double d4 = f(t4, r4.x1, r4.x2, r4.y1, r4.y2);

double d = d1;

if(d2

if(d3

if(d4

return d;

}

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);

}

public static List readPoints(String fname) throws Exception

{

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fname)));

List lst = new Vector();

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 lst = readPoints("in.txt");

double x = f(lst,0,1000,0,1000);

System.out.println(x);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值