`

编程之美-光影切割问题

 
阅读更多
package a;

public class DisorderCount {

	/**《编程之美》“光影切割问题”
	 * 主要是两个问题:
	 * 1.数学公式(设定没有三条以上的直线交于同一点):
	 * 两条直线最多一个交点,将平面分成了4个区域;
	 * 三条直线最多三个交点,将平面分成了7个区域;
	 * 可以推出:N条直线 M个交点,区域数为N+M+1。
	 * 2.逆序数的分治求法:
	 * 交点M的个数就是逆序数对的对数。
	 * 例如左边的光线顺序是(1,2,3),右边是(3,2,1)。那么(3,1)(3,2)(2,1)共三个逆序数对,说明有三个交点。
	 * 归并排序来求逆序数。假设以下数据a1.a2.a3.a4分为两段,此时需要计算它们的逆序数,前半部分a1.a2,后半部分a3.a4.
	 * (这两个部分都是已经排好序的)。如果当前a1>a3,那么可以知道a2>a3,那么当前的逆序为2.即index(a2)-index(a1)+1.
	 * 将两个数组合并的时候,注意一下左边的数组有多少个数比右边的数组的多少数值要大
	 */

	private int count=0;
	
	public static void main(String[] args) {
		int[][] array={
				{4,3,2,1},
				{4,2,3,1},
				{1,2,3,4},
				{3,1,2},
				{2},
		};
		for(int[] each:array){
			DisorderCount test=new DisorderCount();
			int count=test.disorderCount(each);
			System.out.println(count);
		}
		
	}

	public int disorderCount(int[] array){
		if(array==null){
			return -1;
		}
		if(array.length<2){
			return 0;
		}
		disorderCountHelp(array,0,array.length-1);
		return count;
	}
	
	public void disorderCountHelp(int[] array,int start,int end){
		if(start<end){
			int mid=start+(end-start)/2;
			disorderCountHelp(array,start,mid);
			disorderCountHelp(array,mid+1,end);
			merge(array,start,mid,end);
		}
	}
	
	public void merge(int[] array,int start,int mid,int end){
		int i=start;
		int j=mid+1;
		int len=end-start+1;
		int[] tmp=new int[len];
		int k=0;
		while(i<=mid&&j<=end){
			if(array[i]<=array[j]){
				tmp[k++]=array[i++];
			}else{
				tmp[k++]=array[j++];
				count+=mid-i+1;//Each part is sorted.It means the data from a[i] to a[mid] is bigger than a[j].
			}
		}
		while(i<=mid){  
            tmp[k++]=array[i++]; 
        }  
        while(j<=end){  
            tmp[k++]=array[j++];  
        }  
        for(int m=0;m<k;m++){
        	array[start+m]=tmp[m];
        }
	}
}

0
0
分享到:
评论

相关推荐

    FT Slasher Volume01 - FT光影特效插件

    1. **动态切割光线**:插件允许光线在场景中动态切割,创造出独特的光影效果,如激光束、能量刃等,这在科幻或动作游戏中非常常见。 2. **实时阴影**:提供高质量的实时阴影处理,可以实现阴影的软边、距离衰减和...

    3D-o3d.zip

    首先,建模阶段,通过拉伸、旋转和切割等操作,将基本几何体塑造成所需的形状。接着,进行纹理贴图,赋予模型颜色、材质和细节,使其看起来更加真实。最后,通过添加骨骼和关键帧来制作动画,让3D模型具有动态表现。...

    WPF 切水果

    在计算机编程领域,游戏开发一直是一项深受程序员喜爱的挑战。本文将深入探讨一个基于WPF(Windows Presentation Foundation)平台的“切水果”游戏的实现,旨在解析其核心技术和设计思路,为初学者提供一个实践WPF...

    CNC光绘-项目开发

    首先,CNC(计算机数字控制)路由器是一种精密的机械设备,它可以精确地切割或雕刻各种材料,如木材、塑料甚至金属。在这个项目中,CNC路由器被用作一个移动平台,通过预设的路径来控制LED灯的运动,从而在黑暗中画...

    刀光效果

    标题“刀光效果”指的是在数字图像处理或游戏开发中的一种视觉特效,通常用于模拟剑、光线或其他锋利物体切割空气或空间时产生的动态光影效果。这种效果在很多动作游戏中非常常见,为战斗场景增添了紧张刺激的氛围。...

    水果忍者刀光效果

    《水果忍者刀光效果——探索iOS游戏开发的光影魅力》 在移动游戏领域,《水果忍者》无疑是一款经典之作,其独特的切水果玩法和华丽的视觉效果深受玩家喜爱。尤其是刀光效果,它不仅提升了游戏的趣味性,还极大地...

    max城市插件

    "AMX"标签可能指的是该插件使用或兼容的编程语言或技术,AMX(Advanced Macro eXtensions)通常用于游戏开发中的脚本编写,可以提供扩展3D Max功能的能力。在这里,它可能是插件的核心技术,允许用户自定义楼房的...

    javascript 游戏大全 JS特效

    3. 拼图游戏:拼图游戏通常基于图像切割和重组,JavaScript可以通过操作DOM元素,将图片切割成若干块,然后允许用户通过拖放来重新排列。游戏难度可设置为固定位置拼图或自由拼图,实现动态难度调整。 4. 坦克游戏...

    kaleidescope:Node 和 arduino 投影仪万花筒

    你可以利用JavaScript的图像处理库,如sharp或jimp,对上传的图片进行切割、旋转、拼接等操作,模拟传统万花筒的效果。通过不断变换图像的位置和角度,实现动态的视觉效果。 为了增强用户体验,你还可以添加用户...

    2D游戏中的技能特效

    在Unity中,可以使用Sprite Editor对精灵图进行切割和整理,将其转化为单个精灵。 2. **创建对象和组件**:在Unity场景中,为每个技能特效创建一个新的游戏对象。然后添加Sprite Renderer组件,将之前准备好的精灵...

Global site tag (gtag.js) - Google Analytics