`

虫子爬杆问题,使用迭代。

J# 
阅读更多
package test3;

import java.util.ArrayList;
import java.util.Collections;;

/**
 * 问题描述:
 * 		一根长27CM棍上有5只虫分布在 3,7,11,17,23CM 的位置上。虫子们都在一条直线上爬,碰到了就掉头。
 * 		求所有虫子都爬出去所需的最长和最短时间。
 * 解题思路:
 * 		只要每条虫子的方向确定,虫子们都爬出去的时间就确定。
 * 		1条虫子有2个方向,可以看做能取2个值0,1。那5条虫子就是5个取0,1的位的组合,即2的5次方种组合方法。
 * 		用0-31的整数转成2进制表示所有方向方向。
 * @author 杨佳
 *
 */
public class WormTest {
	public static int slong = 27;//49;
	public static int[] wormArr = {3,7,11,17,23};//{3,7,11,17,23,33,37,43};
	/**
	 * @author 杨佳
	 * @param args
	 */
	public static void main(String[] args) {
		ArrayList<Integer> timeList = new ArrayList<Integer>();
		for(int i=0;i<Math.pow(2,wormArr.length);i++){
			timeList.add(getUseTime(i,wormArr));
		}
		Collections.sort(timeList);
		System.out.println("min:"+timeList.get(0));
		System.out.println("max:"+timeList.get(timeList.size()-1));
		
		//虫子相撞是否掉头 对 所有虫子都爬出去所用的时间 没有影响 ,所以有以下简单方法
		int hafe = slong/2;
		ArrayList<Integer> newList = new ArrayList<Integer>();
		for(int i=0;i<wormArr.length;i++){
			if(wormArr[i]>hafe){
				newList.add(slong - wormArr[i]);
			}else{
				newList.add(wormArr[i]);
			}
		}
		Collections.sort(newList);
		System.out.println("min2:"+newList.get(newList.size()-1));
		System.out.println("max2:"+Math.max(Math.max(wormArr[0],slong-wormArr[0]),Math.max(wormArr[wormArr.length-1],slong-wormArr[wormArr.length-1])));
	}
	
	public static int getUseTime(Integer aspect,int[] wormsInit){
		int[] worms = wormsInit.clone();
		int time = 0;
		
		//先把方向处理成数组
		int[] aspectArr = processAspect(aspect,worms.length);
		
		if(worms.length == 0){//同时移出为0,有偶数个虫子时可能发生这种情况
			time += 0;
		}else if(worms.length == 1){
			time += Integer.toBinaryString(aspect).equals("1")?slong-worms[0]:worms[0];
		}else{
			int newAspect = 0;
			int[] newWormArr = null;
			while(true){
				boolean flag = false;
				
				//按方向走
				//先判断是否有虫子已经出去,若出去了,移除数组中的0和对应的方向位 重新生成方向值
				ArrayList<Integer> zeroValue = new ArrayList<Integer>();
				for(int i=0;i<worms.length;i++){
					worms[i] += aspectArr[i];
					if(worms[i]==0||worms[i]==slong)zeroValue.add(i);
				}
				if(zeroValue.size()>0){
					flag = true;
					//新数组
					int leftnum = worms.length - zeroValue.size();
					newWormArr = new int[leftnum];
					int j=0;
					for(int i=0;i<worms.length;i++){
						if(worms[i]!=0&&worms[i]!=slong){
							newWormArr[j] = worms[i];
							j++;
						}
					}
					//新方向值
					newAspect = getNewAspect(aspect,zeroValue,worms.length);
				}else{
					newWormArr = worms;
					newAspect = aspect;
				}
				//再判断是否发生碰撞(即判断 相邻2个是否相等),如果碰撞方向位置反,重新生成方向值(如果有重新生成数组或方向值要跳出循环)
				ArrayList<Integer> hitList = new ArrayList<Integer>();
				for(int i=0;i<newWormArr.length-1;i++){
					int ifHit = new Integer(newWormArr[i]).compareTo(new Integer(newWormArr[i+1]));
					if(ifHit == 0){
						hitList.add(i);
						hitList.add(i+1);
					}
				}
				if(hitList.size()>0){
					flag = true;
					newAspect = getChangeAspect(newAspect,hitList,newWormArr.length);
					
				}
				
				//每循环一次时间++
				time++;
				if(flag == true){
					break;
				}
			}
			time += getUseTime(newAspect,newWormArr);
		}
			
		return time;
	}

	private static int getChangeAspect(int newAspect, ArrayList<Integer> hitList,int length) {
		StringBuffer sb = new StringBuffer(Integer.toBinaryString(newAspect));
		while(sb.length()<length){
			sb.insert(0,0);
		}
		//System.out.println(sb);
		char[] aspectChars = sb.toString().toCharArray();
		char[] newChars = new char[aspectChars.length];
		for(int i=0;i<aspectChars.length;i++){
			if(test(i,hitList)){
				newChars[i] = aspectChars[i]=='0'?'1':'0';
			}else{
				newChars[i] = aspectChars[i];
			}
		}
		return Integer.parseInt(new String(newChars),2);
	}

	//新方向生成
	private static int getNewAspect(Integer aspect, ArrayList<Integer> zeroValue,int length) {
		StringBuffer sb = new StringBuffer(Integer.toBinaryString(aspect));
		while(sb.length()<length){
			sb.insert(0,0);
		}
		//System.out.println(sb);
		char[] aspectChars = sb.toString().toCharArray();
		char[] newChars = new char[aspectChars.length-zeroValue.size()];
		int j=0;
		for(int i=0;i<aspectChars.length;i++){
			if(test(i,zeroValue))continue;
			newChars[j] = aspectChars[i];
			j++;
		}
		//最后2个同时移出的时候 以下值可能为空
		String ass = new String(newChars);
		if(ass.equals(""))return 0;
		return Integer.valueOf(ass, 2);
	}

	private static boolean test(int index ,ArrayList<Integer> zeroValue){
		for(int i : zeroValue){
			if(index == i)return true;
		}
		return false;
	}
	
	//处理方向成数组  设定:0表示负方向,1表示正方向
	private static int[] processAspect(Integer aspect,int length) {
		int[] aspectArr = new int[length];
		StringBuffer sb = new StringBuffer(Integer.toBinaryString(aspect));
		while(sb.length()<length){
			sb.insert(0, 0);
		}
		for(int i=0;i<aspectArr.length;i++){
			aspectArr[i] = new Integer(String.valueOf(sb.charAt(i))) == 1?1:-1;
		}
		
		return aspectArr;
	}
	
	
}

分享到:
评论

相关推荐

    E-Debug虫子修复.rar_E-Debug虫子修复_e-bug虫子修复_e-debug 使用_虫子修复工具_虫子修复版

    本文将深入探讨E-Debug虫子修复的原理、使用方法以及其在软件调试中的重要作用。 首先,我们需要明确什么是“虫子”。“虫子”在计算机术语中通常指代程序错误或漏洞,这些错误可能会影响软件的正常运行,甚至导致...

    机械原理课程设计汇本说明书爬杆机器人.doc

    爬杆机器人的设计旨在通过机械原理课程的实践,训练学生分析和解决问题的能力,激发创新思维。 1. **设计题目简介** 爬杆机器人采用简单的曲柄滑块机构,电机与曲柄固定连接,驱动装置运动。曲柄与连杆铰接,连杆...

    算法-苹果和虫子(信息学奥赛一本通-T1038)(包含源程序).rar

    4. 递归或迭代的实现:解决问题的过程中,是使用了递归函数还是循环结构。 5. 代码的可读性和可维护性:变量命名、注释和代码结构是否清晰。 由于标签为空,我们无法获取额外的信息。但是,根据标题和描述,我们...

    js实现动物壁虎爬动效果,将鼠标作为小虫子的爬动壁虎,前端必看!

    js实现动物壁虎爬动效果,将鼠标作为小虫子的爬动壁虎,前端必看! js实现动物壁虎爬动效果,将鼠标作为小虫子的爬动壁虎,前端必看! js实现动物壁虎爬动效果,将鼠标作为小虫子的爬动壁虎,前端必看! js实现动物...

    C#虫子吃苹果小游戏代码

    【C#虫子吃苹果小游戏代码】是一款基于C#编程语言和MonoGame框架开发的横版游戏。MonoGame是一个开源的跨平台游戏开发框架,它允许开发者使用C#编写游戏,然后在多个操作系统上发布,如Windows、MacOS、Linux以及...

    E-Debug虫子修复工具

    总的来说,"E-Debug虫子修复工具"凭借其强大的反汇编能力和全面的调试功能,为易语言开发者提供了一把利器,使得他们能够在面对程序问题时更加得心应手。无论是初学者还是经验丰富的程序员,都应该熟练掌握这款工具...

    基于几何迭代(ART)的断层成像问题.pdf

    在实际应用中,例如上机实验中提到的虫子在苹果上打洞的例子,通过不同方向的探测测量值,可以使用ART算法重建虫子的位置和形状。初始近似通常设置为零向量,然后进行迭代计算。实验结果表明,经过一定次数的迭代,...

    苹果与虫子2.docx

    我们使用`eat`变量来表示虫子吃掉的苹果数量,其计算方式依据y除以x的商是否为整数来决定。如果y能够被x整除,那么`eat = y / x`;否则,`eat = y / x + 1`。接着,用变量`rest`来表示剩余的苹果数量,根据`rest = n...

    Java游戏熊猫坐虫子

    在本游戏中,判断熊猫是否坐在虫子上,可能使用了矩形碰撞检测,即比较熊猫和虫子的边界框是否重叠。这可以通过比较矩形的x、y坐标以及宽度和高度来实现。 动画效果通常是通过在连续的帧间改变对象的视觉状态来实现...

    捉虫子flash游戏

    6. **循环**:在游戏过程中,可能会使用循环来重复执行某些任务,比如检查虫子是否出现在屏幕内,或者角色是否成功捕捉到虫子。 7. **计时器**:计时器对象可以帮助实现间隔性操作,如控制虫子的出现频率,或者限制...

    虫子屏保 v1.00

    一个很简单很有趣的屏保,有很多虫子在屏幕上爬来爬去。

    E-Debug虫子修复

    E-Debug虫子修复

    1038 虫子和苹果.cpp

    1038:苹果和虫子 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 70115 通过数: 19748 【题目描述】 你买了一箱n个苹果,很不幸的是买完时箱子里混进了一条虫子。虫子每x小时能吃掉一个苹果,假设虫子在吃完一个...

    AS3示例,爬虫子小游戏

    在本示例中,“AS3示例,爬虫子小游戏”是一个使用AS3编写的简单游戏,旨在帮助初学者了解和学习AS3的基本语法和游戏开发技巧。 AS3相比其早期版本AS2,有了显著的性能提升和更严格的类型系统,它采用了ECMAScript ...

    火狐小虫子firebug.zip

    《火狐小虫子Firebug:网页开发与调试的强大工具》 火狐小虫子Firebug,是Firefox浏览器上的一款强大且高效的Web开发与调试工具,它的存在为开发者提供了无与伦比的便利,使他们能够实时查看、编辑和调试HTML、CSS...

    杀虫子游戏 lua开发

    3. 动画效果:为虫子添加爬行动画,使游戏更具生动感。 4. 用户界面:设计美观的UI,提高游戏的吸引力。 通过以上步骤,我们可以构建出一个基本的“杀虫子”游戏。在实际开发过程中,还可以根据需求进一步增加游戏...

    HTML5 Canvas小虫子游动特效.zip

    总的来说,这个"HTML5 Canvas小虫子游动特效"项目不仅展示了Canvas的基本绘图和动画功能,还可能涉及到了jQuery的使用以及CSS的配合。对于想要学习或提升Web前端技能的开发者来说,这是一个很好的实践案例。通过深入...

    抓虫子1.0--狂风寞寞制作

    《抓虫子1.0——狂风寞寞制作》是一款基于Flash AS3技术开发的小游戏。这款游戏虽然没有提供源代码,但通过反编译工具,我们可以深入理解其背后的技术实现,学习AS3(ActionScript 3)编程语言的运用。 ...

    大班体育游戏教案《虫子运动》.docx

    首先,活动目标明确,旨在锻炼幼儿的手脚协调能力,特别是向前爬的能力,这对于大肌肉群的灵活性发展至关重要。同时,鼓励所有幼儿积极参与,特别是对体弱幼儿,希望通过游戏提高他们的身体素质。此外,活动还期望...

    锐捷4.81虫子修改版

    "锐捷4.81虫子修改版"可能是锐捷网络客户端软件的一个特别版本,这个版本可能包含了对原版4.81软件中某些已知问题的修复,或者增加了额外的功能。"虫子"通常是指软件中的错误或漏洞,修改版则意味着这些错误或漏洞...

Global site tag (gtag.js) - Google Analytics