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

本文介绍了使用Java面向对象编程解决蚂蚁爬杆问题的方法。通过创建蚂蚁类模拟蚂蚁行为,包括位置、方向和状态属性,并在蚂蚁移动过程中判断是否超出木杆范围或碰撞,调整蚂蚁的走向。通过遍历蚂蚁的不同初始走向,找出最小和最大离开时间。
摘要由CSDN通过智能技术生成

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

要求:用类模拟出蚂蚁的行为特性,进而模拟出五只蚂蚁在木杆上的运行过程来编程求解。不能通过数学的方式直接用公式计算。

解题思路:

把每个蚂蚁当作一个对象操作,有pos(位置)、direction(走向)、state(状态)属性,只需要在蚂蚁移动的过程中,每移动一次就判断是否走出了杆的长度(0~27),如果走出了范围,马上改变蚂蚁的状态;判断是否有蚂蚁碰面了,如果有碰面,就马上改变蚂蚁的走向。记录时间,输出最大的和最小的。

代码实现:

class Main{

public static void main(String args[]){

int min=999,max=-999;

for(int i=0;i<=1;i++){ //利用五个for来改变蚂蚁的初始走向

for(int j=0;j<=1;j++){

for(int k=0;k<=1;k++){

for(int m=0;m<=1;m++){

for(int n=0;n<=1;n++){

Ant a=new Ant(3); //a蚂蚁放在3cm处

Ant b=new Ant(7); //b蚂蚁放在7cm处

Ant c=new Ant(11); //c蚂蚁放在11cm处

Ant d=new Ant(18); //d蚂蚁放在18cm处

Ant e=new Ant(23); //e蚂蚁放在23cm处

a.direction=i;

b.direction=j;

c.direction=k;

d.direction=m;

e.direction=n;

for(int l=0;;l++){

a.move();

b.move();

c.move();

d.move();

e.move();

if(a.pos==b.pos){ //如果有蚂蚁碰面马上改变这两只蚂蚁走向

a.direction*=-1;b.direction*=-1;

}

if(b.pos==c.pos){

b.direction*=-1;c.direction*=-1;

}

if(c.pos==d.pos){

c.direction*=-1;d.direction*=-1;

}

if(d.pos==e.pos){

d.direction*=-1;e.direction*=-1;

}

// System.out.println(a.state+" "+b.state+" "+c.state+" "+d.state);

if((a.state+b.state+c.state+d.state+e.state)==5){ //如果每个蚂蚁的state都是1,说明全部走出了杆的长度

if(l>max){

max=l;

}

if(l

min=l;

}

//System.out.println(i+" "+j+" "+k+" "+m+" "+n);

//System.out.println(l);

break;

}

}

}

}

}

}

}

System.out.println("所有蚂蚁掉下去最小时间是:"+min);

System.out.println("所有蚂蚁掉下去最大时间是:"+max);

}

}

class Ant{ //蚂蚁对象

int pos; //位置

int direction; //走向

int state=0; //状态

public Ant(int pos){

this.pos=pos;

}

public void move(){ //移动函数

if(this.pos<=0||this.pos>=27){ //超出木杆范围就改变这只蚂蚁的状态

state=1;

}

if(this.direction==0){

this.direction=-1;

}

this.pos=this.pos+direction;

}

}结果:

940ab7ef7a2af6b03b7ca6e24be1ea1c.png

原文:http://blog.csdn.net/xionghui2013/article/details/45046549

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值