首页 > 分享 > 蚂蚁爬杆问题

蚂蚁爬杆问题

蚂蚁爬杆问题--面向对象,建模

最新推荐文章于 2021-08-03 13:21:52 发布

程序小白_龙 于 2017-07-06 19:08:50 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

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

public class AntMove {

public static void main(String[] args) {

int a[]={3,7,11,18,23};

Ant ants[]=new Ant[a.length];

Ant.setANT_NUM(a.length);

int numOfDirectionStates=1;

for(int i=0;i<a.length;i++){

numOfDirectionStates*=2;

}

for(int i=0;i<a.length;i++){

ants[i]=new Ant(numOfDirectionStates);

}

boolean directionStates[][]=new boolean[numOfDirectionStates][a.length];

for(int i=0;i<numOfDirectionStates;i++){

for(int j=0;j<a.length;j++){

directionStates[i][j]=( (i&(1<<j) )==0 );

}

}

for(int i=0;i<numOfDirectionStates;i++){

for(int j=0;j<a.length;j++){

ants[j].setDown(false);

ants[j].setLeft(directionStates[i][j]);

ants[j].setPos(a[j]);

}

Ant.setNumOfDown(0);

Ant.setTime(0);

while(true){

print(ants);

Ant.timeMove();

for(int j=0;j<a.length;j++){

ants[j].move(1);

}

for(int j=0;j<a.length-1;j++){

if(!ants[j].isLeft() && ants[j+1].isLeft() &&

!ants[j].isDown() && !ants[j+1].isDown()){

if(ants[j].getPos()==ants[j+1].getPos()){

System.out.println("发生碰头,掉头走");

ants[j].turnRound();

ants[j+1].turnRound();

}

if(ants[j].getPos()>ants[j+1].getPos()){

System.out.println("发生撞头,这步无效,回退一步,掉头走");

ants[j].move(-1);

ants[j+1].move(-1);

ants[j].turnRound();

ants[j+1].turnRound();

}

}

}

if(Ant.getNumOfDown()==a.length){

break;

}

}

}

int times[]=Ant.getTimes();

System.out.println("最终结果:");

System.out.println("minTime="+Ant.getMinTime());

System.out.println("最短时间掉下杆子的各个蚂蚁运动情况如下:");

int count=0;

for(int i=0;i<times.length;i++){

if( times[i]==Ant.getMinTime() ){

System.out.println("第"+(++count)+"种");

for(int j=0;j<ants.length;j++){

if(directionStates[i][j]){

System.out.println("第"+(j+1)+"个球往左");

}else{

System.out.println("第"+(j+1)+"个球往右");

}

}

}

}

System.out.println();

System.out.println("maxTime="+Ant.getMaxTime());

System.out.println("最长时间掉下杆子的各个蚂蚁运动情况如下:");

count=0;

for(int i=0;i<times.length;i++){

if( times[i]==Ant.getMaxTime() ){

System.out.println("第"+(++count)+"种");

for(int j=0;j<ants.length;j++){

if(directionStates[i][j]){

System.out.println("第"+(j+1)+"个球往左");

}else{

System.out.println("第"+(j+1)+"个球往右");

}

}

}

}

}

private static void print(Ant ants[]) {

boolean isFirst=true;

for(int i=0;i<ants.length;i++){

if(isFirst){

isFirst=false;

System.out.print(ants[i].getPos());

}else{

System.out.print(", "+ants[i].getPos());

}

}

System.out.println();

}

}

class Ant{

public final static int LEFT_END=0;

public final static int RIGHT_END=0;

private static int numOfDown;

private static int time;

private static int ANT_NUM;

private static int minTime=Integer.MAX_VALUE;

private static int maxTime=-1;

private static int times[];

private static int count;

private boolean left;

private int pos;

private boolean down;

public Ant(int a) {

times=new int[a];

}

public void move(int n){

if(!down){

if(left){

pos-=n;

}else{

pos+=n;

}

if(pos<=0||pos>=27){

down=true;

numOfDown++;

if(numOfDown==ANT_NUM){

System.out.println("蚂蚁全部掉下去了");

if(time<minTime){

minTime=time;

}

if(time>maxTime){

maxTime=time;

}

times[count]=time;

count++;

System.out.println("用去时间为:"+time);

System.out.println("此时最小时间为:"+minTime);

System.out.println("此时最大时间为:"+maxTime);

}

}

}

}

public static int[] getTimes() {

return times;

}

public static void setTimes(int[] times) {

Ant.times = times;

}

public static int getNumOfDown() {

return numOfDown;

}

public static void setNumOfDown(int numOfDown) {

Ant.numOfDown = numOfDown;

}

public static int getTime() {

return time;

}

public static void setTime(int time) {

Ant.time = time;

}

public static void timeMove() {

Ant.time++;

}

public static int getANT_NUM() {

return ANT_NUM;

}

public static void setANT_NUM(int aNT_NUM) {

ANT_NUM = aNT_NUM;

}

public static int getMinTime() {

return minTime;

}

public static void setMinTime(int minTime) {

Ant.minTime = minTime;

}

public static int getMaxTime() {

return maxTime;

}

public static void setMaxTime(int maxTime) {

Ant.maxTime = maxTime;

}

public boolean isLeft() {

return left;

}

public void setLeft(boolean left) {

this.left = left;

}

public int getPos() {

return pos;

}

public void setPos(int location) {

this.pos = location;

}

public boolean isDown() {

return down;

}

public void setDown(boolean down) {

this.down = down;

}

public void turnRound(){

left=!left;

}

}

相关知识

爬杆
爬杆比赛中为什么 是静摩擦力
划为9种猴爬杆
宝贝爬杆
熊猫爬杆下载
一种猫爬杆
两人作爬杆比赛,已知两人体重G 甲 ∶G 乙 =5∶6,甲用了9s爬到顶,乙用了10s爬到顶,则甲、乙两人爬杆时
徐明远自创“猴子爬杆”绝技
20、拟攀爬:爬杆.doc
继电器控制的爬杆机器人.pdf

网址: 蚂蚁爬杆问题 https://m.mcbbbk.com/newsview504658.html

所属分类:萌宠日常
上一篇: 小军同学喜欢运动,在一次参加爬杆
下一篇: 小军同学喜欢运动,在一次参加爬杆