蚂蚁过杆问题

问题:有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、18厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过两只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。

思路:因为没有告诉蚂蚁的初始朝向,所以要对初始化蚂蚁朝向。用0表示朝左,1表示朝右,用二进制00000(0)表示五只蚂蚁都是朝向左,然后每次加1,直到加到11111(31)时,表示五只蚂蚁初始的所有朝向。让后随时间的推移,有些蚂蚁可能碰头,这是就的对蚂蚁的朝向就行修改,即:如原来朝向为0,则变为1,原来为1的变为0,。做到这里就会想到如何判断蚂蚁朝向问题,这个可以通过异或来解决问题。如:当要判断第一只蚂蚁朝向时,可以用二进制10000(16)与原来朝向异或,若结果为0,则表示朝向为1,朝右,否则相反;用二进制01000(8)与原来朝向异或,可以判断第二个蚂蚁的朝向,以此类推。

代码实现:

import java.util.*;
public class Ant{
	public static void main(String args[]){
		Scanner sc=new Scanner(System.in);
		System.out.println("输入五只蚂蚁的位置(厘米)(大于0小于27且不能有相同的):");
		while(sc.hasNext()){
			int[] q=new int[5];//{3,7,11,18,23};输入五只蚂蚁的初始位置
		    for(int b=0;b<q.length;b++){
		    	q[b]=sc.nextInt();
		    }
			int maxtime=-1,mintime=10000,signmax=0,signmin=0;
			for(int num=0;num<=31;num++){//五只蚂蚁初始的朝向
				int i=num;//一种初始朝向后,直到所有蚂蚁掉下的过程中中途朝向的变化
			    int[] p=new int[5];//{3,7,11,18,23};
			    for(int b=0;b<p.length;b++){//保留q[]的初值
			    	p[b]=q[b];
			    }
			    int sum=0;//所有蚂蚁掉下去的时间
				while(1>0){
					if(f(p)==p.length){//直到五只蚂蚁都掉下去时,退出循环,进行下一种五只蚂蚁初始朝向的计算
						break;
					}
					sum++;
					for(int j=0;j<p.length;j++){//通过判断朝向 对位置进行加减
						int k=(int)Math.pow(2,j);
						if((i&k)==0){
							p[j]-=1;
						}else{
							p[j]+=1;
						}
					}
					for(int j=0;j<p.length-1;j++){//判断有没有碰头 然后重新记录五只蚂蚁的朝向
						if(p[j]==p[j+1]){
							int k=(int)Math.pow(2,j);
					    	if((i&k)==0){
						    	i-=k;
					    	}else{
						    	i+=k;
					    	}
						}
					}
				}
				if(sum>maxtime){
					maxtime=sum;signmax=num;
				}
				if(sum<mintime){
					mintime=sum;signmin=num;
				}
				//System.out.print(sum+" ");
			}
			System.out.println("maxtime= "+maxtime+" 秒 ");
			System.out.println("mintime= "+mintime+" 秒\n");
			System.out.println("输入五只蚂蚁的位置(厘米)(大于0小于27且不能有相同的):");
		}

	}
	public static int f(int a[]){//记录蚂蚁掉下去的个数
		int k=0;
		for(int i=0;i<a.length;i++){
			if(a[i]>=27||a[i]<=0){
				k++;
			}
		}
		return k;
	}
}

时间: 2024-10-23 03:31:47

蚂蚁过杆问题的相关文章

蚂蚁爬杆问题js实现

面外包时,腾讯导师出的面试题,简单记录一下 运行效果 代码 <!DOCTYPE html> <html> <head> <title>蚂蚁爬杆实验</title> <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> </head> <body> <div style=&

编程之美4.7 | 蚂蚁爬杆

有一根长为L的平行于x轴的细木杆,其左端点的x坐标为0(故右端点的x坐标为L).刚开始时,上面有N只蚂蚁,第i(1≤i≤N)只蚂蚁的横坐标为xi(假设xi已经按照递增顺序排列),方向为di(0表示向左,1表示向右),每个蚂蚁都以速度v向前走,当任意两只蚂蚁碰头时,它们会同时调头朝相反方向走,速度不变.编写程序求所有蚂蚁都离开木杆的最短时间和最长时间. 解法: 我们假设每只蚂蚁都背着一袋粮食,任意两只蚂蚁碰头时交换各自的粮食然后调头.这种情况下,每次有一只蚂蚁离开木杆都意味着一袋粮食离开木杆(虽然

蚂蚁过杆问题(二) ------java面向对象处理

问题:有一根27厘米的细木杆,在第3厘米.7厘米.11厘米.18厘米.23厘米这五个位置上各有一只蚂蚁.木杆很细,不能同时通过两只蚂蚁.开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退.当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走.假设蚂蚁们每秒钟可以走一厘米的距离.编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间. 思路:因为没有告诉蚂蚁的初始朝向,所以要对初始化蚂蚁朝向.用0表示朝左,1表示朝右,用二进制00000(0)表示五只蚂蚁都是朝向左,然后每次加1,直到

编程之美---蚂蚁爬杆

一根长27cm的木棍上,在5个点上有5只蚂蚁,蚂蚁在开始的时候朝任意方向出发,只能掉头或者往前走.让任意两只蚂蚁碰头时,它们同时掉头朝反方向走.假设蚂蚁的速度都是一秒一厘米,求蚂蚁都离开木棍的最短时间和最长时间. 蚂蚁相遇后掉头往反向走,可以看作蚂蚁相遇后,擦肩而过,相当于两只蚂蚁互换了各自的行程.所以把每只蚂蚁离自己较远的一端,和较近的一端计算出来,分别取最大值,就是最长时间和最短时间. 扩展问题 参考网址 http://blog.csdn.net/weichaohnu/article/det

4.7 蚂蚁爬杆

题目:有一根树枝,树枝很细,不能同时通过两只蚂蚁.开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退. 当两只蚂蚁碰头时,它们会同时调头朝反方向走. 求所有蚂蚁都离开木杆的最短时间和最长时间. 思想:虽然两只蚂蚁相遇后是调头往反方向走,但是,可以"看作"两个蚂蚁相遇后,擦身而过. 也就是说,可以认为蚂蚁的运动是独立的,是否碰头并不是重点. 所以,程序只需要遍历所有的蚂蚁,把每个蚂蚁走出木杆的最长时间(蚂蚁向离自己较远的一端走去),最短时间(蚂蚁向离自己较近的一端走去

蚂蚁爬杆问题(Java面向对象)

有一根27厘米的细木杆,在第3厘米.7厘米.11厘米.18厘米.23厘米这五个位置上各有一只蚂蚁.木杆很细,不能同时通过两只蚂蚁.开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退.当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走.假设蚂蚁们每秒钟可以走一厘米的距离.编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间. 要求:用类模拟出蚂蚁的行为特性,进而模拟出五只蚂蚁在木杆上的运行过程来编程求解.不能通过数学的方式直接用公式计算. 解题思路: 把每个蚂蚁当作一个对象操作,

面向对象蚂蚁爬杆的问题

package cn.hncu.day5.ant; public class Ant { private int pos; private boolean isLeft = true;// 默认朝左 private boolean isDown = false;// 默认在细杆上 private final static int LEFT_END=0; private final static int RIGHT_END=27; private static int numOfDown; pri

蚂蚁爬杆问题

思路, 为了考虑最长的时间,假设两只蚂蚁相遇后不调头,这样每只蚂蚁都是独立运动的,只要求蚂蚁到杆子端点的距离就好了 int L, n; int arr[MAX_N]; int solve() { int minT = 0; for(int i=0; i<n; ++i) { minT = max(minT, min(arr[i],L-arr[i])); } int maxT = 0; for(int i=0; i<n; ++i) { maxT = max(maxT, max(arr[i],L-a

蚂蚁爬杆

问题: 解答: 伪代码如下: void CalcTime(double Length,// length of the stick double *XPos,//position of an ant,<=length int AntNum,  //number of ants double Speed, //speed of ants double &Min,//return value of the minimum time double &Max)//return value o