• 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<PP> 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<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 = x2;
    		double x2a = x1;
    		double y1a = y2;
    		double y2a = 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;
    		}
    		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<PP> t1 = new Vector<PP>();
    		List<PP> t2 = new Vector<PP>();
    		List<PP> t3 = new Vector<PP>();
    		List<PP> t4 = new Vector<PP>();
    		
    		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.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<d) d = d2;
    		if(d3<d) d = d3;
    		if(d4<d) d = 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<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,0,1000,0,1000);
    		System.out.println(x);
    	}	
    }
    
  • 相关阅读:
    第三章 Selenide测试框架
    第二章 自动化测试的本质理解
    第一章 软件自动化测试的基础知识
    【算法学习】03---算法分析学习
    【算法学习】03---算法分析
    【算法学习】02---二分算法总结
    【算法学习】01---java基础以及算法基础常用类库
    前端自动化测试一些学习记录
    Ubuntu下安装Sublime3的Markdown插件
    octopress搭建记录
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12947233.html
Copyright © 2020-2023  润新知