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虫子修复的原理、使用方法以及其在软件调试中的重要作用。 首先,我们需要明确什么是“虫子”。“虫子”在计算机术语中通常指代程序错误或漏洞,这些错误可能会影响软件的正常运行,甚至导致...
爬杆机器人的设计旨在通过机械原理课程的实践,训练学生分析和解决问题的能力,激发创新思维。 1. **设计题目简介** 爬杆机器人采用简单的曲柄滑块机构,电机与曲柄固定连接,驱动装置运动。曲柄与连杆铰接,连杆...
4. 递归或迭代的实现:解决问题的过程中,是使用了递归函数还是循环结构。 5. 代码的可读性和可维护性:变量命名、注释和代码结构是否清晰。 由于标签为空,我们无法获取额外的信息。但是,根据标题和描述,我们...
js实现动物壁虎爬动效果,将鼠标作为小虫子的爬动壁虎,前端必看! js实现动物壁虎爬动效果,将鼠标作为小虫子的爬动壁虎,前端必看! js实现动物壁虎爬动效果,将鼠标作为小虫子的爬动壁虎,前端必看! js实现动物...
【C#虫子吃苹果小游戏代码】是一款基于C#编程语言和MonoGame框架开发的横版游戏。MonoGame是一个开源的跨平台游戏开发框架,它允许开发者使用C#编写游戏,然后在多个操作系统上发布,如Windows、MacOS、Linux以及...
总的来说,"E-Debug虫子修复工具"凭借其强大的反汇编能力和全面的调试功能,为易语言开发者提供了一把利器,使得他们能够在面对程序问题时更加得心应手。无论是初学者还是经验丰富的程序员,都应该熟练掌握这款工具...
在实际应用中,例如上机实验中提到的虫子在苹果上打洞的例子,通过不同方向的探测测量值,可以使用ART算法重建虫子的位置和形状。初始近似通常设置为零向量,然后进行迭代计算。实验结果表明,经过一定次数的迭代,...
我们使用`eat`变量来表示虫子吃掉的苹果数量,其计算方式依据y除以x的商是否为整数来决定。如果y能够被x整除,那么`eat = y / x`;否则,`eat = y / x + 1`。接着,用变量`rest`来表示剩余的苹果数量,根据`rest = n...
在本游戏中,判断熊猫是否坐在虫子上,可能使用了矩形碰撞检测,即比较熊猫和虫子的边界框是否重叠。这可以通过比较矩形的x、y坐标以及宽度和高度来实现。 动画效果通常是通过在连续的帧间改变对象的视觉状态来实现...
6. **循环**:在游戏过程中,可能会使用循环来重复执行某些任务,比如检查虫子是否出现在屏幕内,或者角色是否成功捕捉到虫子。 7. **计时器**:计时器对象可以帮助实现间隔性操作,如控制虫子的出现频率,或者限制...
一个很简单很有趣的屏保,有很多虫子在屏幕上爬来爬去。
E-Debug虫子修复
1038:苹果和虫子 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 70115 通过数: 19748 【题目描述】 你买了一箱n个苹果,很不幸的是买完时箱子里混进了一条虫子。虫子每x小时能吃掉一个苹果,假设虫子在吃完一个...
在本示例中,“AS3示例,爬虫子小游戏”是一个使用AS3编写的简单游戏,旨在帮助初学者了解和学习AS3的基本语法和游戏开发技巧。 AS3相比其早期版本AS2,有了显著的性能提升和更严格的类型系统,它采用了ECMAScript ...
《火狐小虫子Firebug:网页开发与调试的强大工具》 火狐小虫子Firebug,是Firefox浏览器上的一款强大且高效的Web开发与调试工具,它的存在为开发者提供了无与伦比的便利,使他们能够实时查看、编辑和调试HTML、CSS...
3. 动画效果:为虫子添加爬行动画,使游戏更具生动感。 4. 用户界面:设计美观的UI,提高游戏的吸引力。 通过以上步骤,我们可以构建出一个基本的“杀虫子”游戏。在实际开发过程中,还可以根据需求进一步增加游戏...
总的来说,这个"HTML5 Canvas小虫子游动特效"项目不仅展示了Canvas的基本绘图和动画功能,还可能涉及到了jQuery的使用以及CSS的配合。对于想要学习或提升Web前端技能的开发者来说,这是一个很好的实践案例。通过深入...
《抓虫子1.0——狂风寞寞制作》是一款基于Flash AS3技术开发的小游戏。这款游戏虽然没有提供源代码,但通过反编译工具,我们可以深入理解其背后的技术实现,学习AS3(ActionScript 3)编程语言的运用。 ...
首先,活动目标明确,旨在锻炼幼儿的手脚协调能力,特别是向前爬的能力,这对于大肌肉群的灵活性发展至关重要。同时,鼓励所有幼儿积极参与,特别是对体弱幼儿,希望通过游戏提高他们的身体素质。此外,活动还期望...
"锐捷4.81虫子修改版"可能是锐捷网络客户端软件的一个特别版本,这个版本可能包含了对原版4.81软件中某些已知问题的修复,或者增加了额外的功能。"虫子"通常是指软件中的错误或漏洞,修改版则意味着这些错误或漏洞...