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

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

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

注意:在new一个对象数组后,还要记得对对象数组再次new,知道最后为基本类型为止。

	Ant a[]=new Ant[5];
	for(int i=0;i<a.length;i++){
		a[i]=new Ant();
	}

代码实现:

import java.util.*;
class Ant{
	int direction,position;
	public Ant(int d,int p){
		this.set(d,p);
	}
	public Ant(){//令初始值为0
		this.set(0,0);
	}
	public Ant(Ant a){
		this.set(a.direction,a.position);
	}
	public void set(int d,int p){
		this.direction=d;
		this.position=p;
	}
	public void change(Ant a[],int n){//改变蚂蚁的初始朝向,通过加1来改变初始朝向。如:00000+1  --->  00001,00010 ---> 00011  一直到 11111。(相当于二进制加法)
		if(n<a.length){
			a[n].direction+=1;
			if(a[n].direction>1){//大于1时,原值变为0,并向下一位进1
				a[n].direction=0;//原值变为0
				change(a,n+1);//下一位进1
			}
		}
		return ;
	}
	public void move(Ant a){//蚂蚁移动
		if(Ant.direct(a)){//若为0,则向左移动,为1,则向右移动
			a.position--;
		}else{
			a.position++;
		}
		a.direction=a.direction&1;
	}
	public static boolean direct(Ant a){//判断蚂蚁的朝向问题
		return (a.direction&1)==1;
	}
	public int fallNumb(Ant a[]){//记录蚂蚁掉下去的个数
		int k=0;
		for(int i=0;i<a.length;i++){
			if(a[i].position>=27||a[i].position<=0){
				k++;
			}
		}
		return k;
	}
	public String toString(){
		return "direction: "+this.direction+" position: "+this.position;
	}
}
class Main{
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		Ant ant=new Ant();
		Ant a[]=new Ant[5];
		int n;
		for(int i=0;i<a.length;i++){//记住 ,这里一定要在new,对于初学java的我卡死这里了<img alt="大哭" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/wail.gif" />
			a[i]=new Ant();
		}
		for(int i=0;i<a.length;i++){
			a[i].position=sc.nextInt();
			a[i].direction=0;
		}
		Ant b[]=new Ant[5];
		for(int i=0;i<b.length;i++){
			b[i]=new Ant();
		}
		int min=99999,max=-99999,step=0;
		for(int i=0;i<=31;i++){
			for(int k=0;k<b.length;k++){//保留蚂蚁的初始位置,但初始朝向时改变的
				b[k].position=a[k].position;
				b[k].direction=a[k].direction;
			}
			step=0;//记录步数
			ant.change(a,0);
			while(true){
				if(ant.fallNumb(b)==5){//若掉下的蚂蚁数为5,则结束
					break;
				}
				step++;
				for(int k=0;k<5;k++){//蚂蚁移动
					ant.move(b[k]);
				}
			   	/*for(int k=0;k<b.length;k++){
					System.out.print(b[k].position+" ");
				}System.out.println();*/
				for(int k=0;k<4;k++){//判断是否碰头
					if(b[k].position==b[k+1].position){若碰头则0变1,1变0
						b[k].direction=(b[k].direction)&1;
						b[k+1].direction=(b[k+1].direction)&1;
					}
				}
			}
			if(step>max){
				max=step;
			}
			if(step<min){
				min=step;
			}
 		}
		System.out.println("max time= "+max+" second.");
		System.out.println("min time= "+min+" second.");
	}
}
时间: 2024-10-06 04:29:50

蚂蚁过杆问题(二) ------java面向对象处理的相关文章

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

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

20135234马启扬 实验二 Java面向对象程序设计

北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1352  姓名:马启扬  学号:20135234 成绩:             指导教师:娄嘉鹏    实验日期:2015.5.7 实验密级:         预习程度:         实验时间:15:50--22:50 仪器组次:34         必修/选修: 选修            实验序号:02 实验名称:实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和T

20145237 实验二 “Java面向对象程序设计”

20145237 实验二 “Java面向对象程序设计” 实验内容 • 理解并掌握面向对象三要素:封装.继承.多态 • 初步掌握UML建模 • 熟悉S.O.L.I.D原则 • 使用TDD设计实现复数类 实验步骤 单元测试 •1.三种代码: • 伪代码: 百分制转五分制: 如果成绩小于60,转成“不及格” 如果成绩在60与70之间,转成“及格” 如果成绩在70与80之间,转成“中等” 如果成绩在80与90之间,转成“良好” 如果成绩在90与100之间,转成“优秀” 其他,转成“错误” 产品代码: 3

20145311实验二 &quot;Java面向对象程序设计&quot;

20145311实验二 "Java面向对象程序设计" 程序设计过程 实验内容 使用单元测试.TDD的方式设计实现复数类 Complex 编写代码: 1.首先设计实现复数类 Complex,复数类 Complex的方法设计有:复数类的定义.复数类输出的形式,复数的加法.减法.乘法.除法(除法因为涉及到一个整除的问题,所以会有些缺陷)运算. 2.伪代码:Complex类中会有一个复数的实部与虚部,以及复数输出的形式然后是四种运算:加法:实部相加,虚部相加,最后返回虚数的形式减法:实部相减,

20145326《Java程序设计》实验二Java面向对象程序设计实验报告

20145326<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 一.单元测试 1. 三种代码·伪代码·产品代码·测试代码Example:需求:我们要在一个MyUtil类中解决一个百分制成绩转成“优.良.中.及格.不及格”五级制成绩的功能. 伪代码: 百分制转五分制: 如果成绩小于60,转成“不及格” 如果成绩在60与70之间,转成“

20165336 实验二 Java面向对象程序设计

20165336 实验二 Java面向对象程序设计 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:康志强 学号:20165336 指导教师:娄嘉鹏 实验日期:2018年4月16日 实验时间:13:45 - 15:25 实验序号:实验二 实验名称:Java面向对象程序设计 实验目的与要求: 二.实验内容 1初步掌握单元测试和TDD 2 理解并掌握面向对象三要素:封装.继承.多态 3 初步掌握UML建模 4 熟悉S.O.L.I.D原则 5 了解设计模式 三.实验要求 1.没有Li

20165306 实验二 Java面向对象程序设计

实验二 Java面向对象程序设计 实验要求 1.提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图,截图上要有画图加水印,输入自己的学号.本提交点考查JUnit会不会使用,测试用例至少要包含正常情况,错误情况,边界情况的测试. 2.使用JUnit学习Java,以 TDD的方式研究学习StringBuffer.提交你的单元测试用例和测试通过的截图,截图要加上学号水印.测试自己会不会写JUnit测试用例. 3.对设计模式示例进行扩充,体会OCP原则和DIP原则的应用,初步理解

20165332实验二 Java面向对象程序设计

20165332实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等).解决办法(空洞的方法如"查网络"

20165308 实验二 Java面向对象程序设计

20165308 实验二 Java面向对象程序设计 实验二 Java面向对象程序设计 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:张士洋 学号:20165308 指导教师:娄嘉鹏 实验日期:2018年4月16日 实验时间:15:35 - 17:15 实验序号:实验二 实验名称:Java面向对象程序设计 实验内容及要求: 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验内容.步骤与体会 目

Java程序设计 实验二 Java面向对象程序设计

北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1353  姓名:李海空  学号:20135329 成绩:             指导教师:娄嘉鹏      实验日期:2015.5.7 实验密级:         预习程度:         实验时间: 仪器组次:          必修/选修:            实验序号: 实验名称:       Java面向对象程序设计 实验目的与要求:实验内容 1. 初步掌握单元测试和TDD 2.