蚂蚁过桥-面向对象方法实现-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实现面向对象编程——JAVA关键字与保留字说明及使用
-
Java面向对象(一):方法—初识面向对象
-
大数据-java基础-第12章 面向对象的java实现-接口练习
-
#JAVA#面向对象(方法的形式参数是类名的时候如何调用)
-
封装计算方法实现面向对象计算器。
-
Java基础知识(三)面向对象、类和对象、封装继承多态、构造方法、内部类、包装类
-
Java SE面向对象--06.类与对象、封装、构造方法
-
java 使用面向对象方式实现录入学生信息,取出成绩最大值、最小值、平均值、对其进行排序
-
JAVA面向对象编程的思想及方法定义和调用
-
java面向对象--构造方法、this关键字、JavaBean