欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

蚂蚁过桥-面向对象方法实现-java

程序员文章站 2022-06-07 20:02:24
...

蚂蚁过桥-面向对象方法实现-java语言编写

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

现有的答案多通过数学方法进行程序设计,而我突发奇想用面向对象思维模拟蚂蚁的行为,将会有什么样的效果呢?
我的答案如下;

package 蚂蚁过桥;

class Ant{
	int site;//当前位置坐标
	int direction;//0代表左  1代表右
	
	Ant(int site,int direction){
		this.site=site;
		this.direction=direction;
	}
	
	void changeDirection() {//改变对象的方向
		if(this.direction==1)this.direction=0;
		else this.direction=1;
	}
	int judgeOut() {//判断当前蚂蚁是否通过桥
		/*
		 * 过桥的情况有两种:
		 * 一个是蚂蚁的朝向为左 坐标<=0
		 * 一个是蚂蚁的朝向为右 坐标>=27
		 */
		if(this.direction==0&&this.site<=0||
				this.direction==1&&this.site>=27)
			return 0;//过桥则返回0
		else return 1;//没过桥返回1
	}
	
}
public class antPass2 {

	static int judgeMeet(Ant a,Ant b){//判断当前两只蚂蚁是否相遇
		if(a.site==b.site&&a.direction!=b.direction)
			return 1;//相遇 返回1
		else return 0;//没相遇 返回0
	}
	static void judgeMeet(Ant a[]) {//判断当前蚂蚁数组是否有蚂蚁相遇,若相遇则改变这两者的方向
		for(int i=0;i<4;i++) {
			int num=judgeMeet(a[i],a[i+1]);
			if(num>0) {
				a[i].changeDirection();
				a[i+1].changeDirection();
			}
			num=0;
		}
	}
	static int judgeOut(Ant a[]) {//返回蚂蚁数组中没有过桥的蚂蚁数量
		int i=0,num=0;//num记录当前蚂蚁数组中没有过桥的蚂蚁数量、
		for(i=0;i<5;i++) {
			num=num+a[i].judgeOut();
		}
		return num;
		//若是全部过桥则返回0
	}
	
	static void move(Ant a[]) {//所有蚂蚁运动一次,即坐标改变一次
		for(int i=0;i<5;i++) {
			if(a[i].direction==0) {
				a[i].site--;
			}else if(a[i].direction==1) {
				a[i].site++;
			}
		}
	}
	static int run(Ant a[]) {//返回一组蚂蚁过桥所用时间
		int time=0;
		while(true) {
			move(a);
			time++;
			if(judgeOut(a)==0) break;
			else {
				judgeMeet(a);
			}
		}
		return time;
	}
	static Ant[] arrange(int n) {//返回一个拥有新方向序列的蚂蚁数组
		Ant[] p=new Ant[5];
		p[0]=new Ant(3,0);
		p[1]=new Ant(7,0);
		p[2]=new Ant(11,0);
		p[3]=new Ant(17,0);
		p[4]=new Ant(23,0);
		
		//以下算法 是将一个十进制数转换至二进制数
		//即用0~31相应的二进制数中0、1代表32种情况的蚂蚁序列
		//此算法来源于网络
		int t,k;
		int[] array= {0,0,0,0,0};
		k=4;
		while(n!=0) {
			t=n/2;
			array[k]=n-t*2;
			n=n/2;
			k--;
		};
		for(int i=0;i<5;i++) {
			p[i].direction=array[i];
		}
		return p;
	}
	
	public static void main(String[] args) {
		
		Ant[] p=new Ant[5];
		p[0]=new Ant(3,0);
		p[1]=new Ant(7,0);
		p[2]=new Ant(11,0);
		p[3]=new Ant(17,0);
		p[4]=new Ant(23,0);
		int timeEvery=run(p);
		int timeMax=timeEvery,timeMin=timeEvery;
		
		for(int i=0;i<32;i++) {
			p=arrange(i);
			timeEvery=run(p);
			if(timeEvery>timeMax) timeMax=timeEvery;
			else if(timeEvery<timeMin) timeMin=timeEvery;
			
		}
		
		System.out.println("最大时间为:"+timeMax);
		System.out.println("最短时间为:"+timeMin);
		
	}
	
	
}```

结果显示:
最小时间为11秒,最大时间为24秒。
相关标签: java 面向对象