面向对象蚂蚁爬杆的问题

package cn.hncu.day5.ant;

public class Ant {
private int pos;
private boolean isLeft = true;// 默认朝左
private boolean isDown = false;// 默认在细杆上
private final static int LEFT_END=0;
private final static int RIGHT_END=27;

private static int numOfDown;
private static int num;
private static int minTime=Integer.MAX_VALUE,maxTime;
private static int time=0;

public Ant(int pos) {
this.pos = pos;
}
public void step(int i){
if(!isDown){
if(isLeft){
pos-=i;
}else{
pos+=i;
}
if(pos<=LEFT_END || pos>=RIGHT_END){
isDown = true;
numOfDown++;
if(numOfDown==num){
//System.out.println("全部掉下去了....");
if(time<minTime){
minTime = time;
}
if(time>maxTime){
maxTime=time;
}
}
}

}
}
public static int getNum() {
return num;
}
public static void setNum(int num) {
Ant.num = num;
}
public int getPos() {
return pos;
}
public void setPos(int pos) {
this.pos = pos;
}
public boolean isLeft() {
return isLeft;
}
public void setLeft(boolean isLeft) {
this.isLeft = isLeft;
}
public boolean isDown() {
return isDown;
}
public void setDown(boolean isDown) {
this.isDown = isDown;
}

public static int getNumOfDown() {
return numOfDown;
}
public static void setNumOfDown(int numOfDown) {
Ant.numOfDown = numOfDown;
}
public static boolean isOver(){
return numOfDown==num;
}
public void turnAround(){
isLeft = !isLeft;
}
public static void setTime(int n){
time=n;
}
public static void timeGo(){
time++;
}
public static int getMinTime() {
return minTime;
}
public static int getMaxTime() {
return maxTime;
}

}

----------------------------------------------------

package cn.hncu.day5.ant;

public class AntRun {
public static void main(String[] args) {
//创建蚂蚁
int a[]={3,7,11,18,23};
int numOfDirectionStates=1;//所有蚂蚁可能的朝向状态数
Ant ants[] = new Ant[a.length];
for(int i=0;i<ants.length;i++){
ants[i] = new Ant( a[i] );
numOfDirectionStates *=2;
}
Ant.setNum(ants.length);

//把所有蚂蚁可能的朝向记录到一个数组
boolean directionStates[][] = new boolean[numOfDirectionStates][ants.length];
// for(int i=0;i<directionStates.length;i++){
// directionStates[i][0] = ((i & 0x01) ==0) ;
// directionStates[i][1] = ((i & 0x02) ==0) ;
// directionStates[i][2] = ((i & 0x04) ==0) ;
// directionStates[i][3] = ((i & 0x08) ==0) ;
// directionStates[i][4] = ((i & 0x10) ==0) ;
// }
for(int i=0;i<directionStates.length;i++){
for(int j=0;j<directionStates[i].length;j++){
directionStates[i][j]= ((i & (1<<j)) ==0) ;
}
}

//让这些蚂蚁在细杆上爬

for (int i = 0; i < directionStates.length; i++) {//总共有a^ants.length-1即directionStates.length多种朝向状态,每种都用来跑一次
//对每只蚂蚁进行初始化
//给每只蚂蚁设置初始朝向,初始位置,是否掉下去
for(int j=0;j<directionStates[i].length;j++){
ants[j].setLeft(directionStates[i][j]);
ants[j].setPos(a[j]);
ants[j].setDown(false);
}
Ant.setNumOfDown(0);
Ant.setTime(0);
//开跑
print(ants);
while (!Ant.isOver()) {
Ant.timeGo();
for (int j = 0; j < ants.length; j++) {//先让每只蚂蚁往前走一步
ants[j].step(1);
}
//判断是否碰头
for(int j=0; j<ants.length-1;j++){
//碰头只可能发生在 左边那只向右,右边那只向左---且都在细杆上
if(!ants[j].isLeft() && ants[j+1].isLeft() &&
!ants[j].isDown()&&!ants[j+1].isDown() ){
//根据位置判断:碰头或撞头
//1碰头--换方向
if(ants[j].getPos()==ants[j+1].getPos()){
System.out.println("碰头...");
ants[j].turnAround();
ants[j+1].turnAround();
}
//2撞头--回退1步且换方向
if(ants[j].getPos()>ants[j+1].getPos()){
System.out.println("撞头....");
ants[j].step(-1);
ants[j+1].step(-1);
ants[j].turnAround();
ants[j+1].turnAround();
}
}

}

print(ants);
}
}

System.out.println("※※※minTime="+Ant.getMinTime()+",maxTime="+Ant.getMaxTime());
}

private static void print(Ant ants[]){
for(int i=0;i<ants.length;i++){
if(i<ants.length-1){
System.out.print(ants[i].getPos()+",");
}else{
System.out.println(ants[i].getPos());
}
}
}
}

时间: 2024-10-12 10:51:31

面向对象蚂蚁爬杆的问题的相关文章

蚂蚁爬杆问题js实现

面外包时,腾讯导师出的面试题,简单记录一下 运行效果 代码 <!DOCTYPE html> <html> <head> <title>蚂蚁爬杆实验</title> <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> </head> <body> <div style=&

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

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

编程之美4.7 | 蚂蚁爬杆

有一根长为L的平行于x轴的细木杆,其左端点的x坐标为0(故右端点的x坐标为L).刚开始时,上面有N只蚂蚁,第i(1≤i≤N)只蚂蚁的横坐标为xi(假设xi已经按照递增顺序排列),方向为di(0表示向左,1表示向右),每个蚂蚁都以速度v向前走,当任意两只蚂蚁碰头时,它们会同时调头朝相反方向走,速度不变.编写程序求所有蚂蚁都离开木杆的最短时间和最长时间. 解法: 我们假设每只蚂蚁都背着一袋粮食,任意两只蚂蚁碰头时交换各自的粮食然后调头.这种情况下,每次有一只蚂蚁离开木杆都意味着一袋粮食离开木杆(虽然

编程之美---蚂蚁爬杆

一根长27cm的木棍上,在5个点上有5只蚂蚁,蚂蚁在开始的时候朝任意方向出发,只能掉头或者往前走.让任意两只蚂蚁碰头时,它们同时掉头朝反方向走.假设蚂蚁的速度都是一秒一厘米,求蚂蚁都离开木棍的最短时间和最长时间. 蚂蚁相遇后掉头往反向走,可以看作蚂蚁相遇后,擦肩而过,相当于两只蚂蚁互换了各自的行程.所以把每只蚂蚁离自己较远的一端,和较近的一端计算出来,分别取最大值,就是最长时间和最短时间. 扩展问题 参考网址 http://blog.csdn.net/weichaohnu/article/det

4.7 蚂蚁爬杆

题目:有一根树枝,树枝很细,不能同时通过两只蚂蚁.开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退. 当两只蚂蚁碰头时,它们会同时调头朝反方向走. 求所有蚂蚁都离开木杆的最短时间和最长时间. 思想:虽然两只蚂蚁相遇后是调头往反方向走,但是,可以"看作"两个蚂蚁相遇后,擦身而过. 也就是说,可以认为蚂蚁的运动是独立的,是否碰头并不是重点. 所以,程序只需要遍历所有的蚂蚁,把每个蚂蚁走出木杆的最长时间(蚂蚁向离自己较远的一端走去),最短时间(蚂蚁向离自己较近的一端走去

蚂蚁爬杆问题

思路, 为了考虑最长的时间,假设两只蚂蚁相遇后不调头,这样每只蚂蚁都是独立运动的,只要求蚂蚁到杆子端点的距离就好了 int L, n; int arr[MAX_N]; int solve() { int minT = 0; for(int i=0; i<n; ++i) { minT = max(minT, min(arr[i],L-arr[i])); } int maxT = 0; for(int i=0; i<n; ++i) { maxT = max(maxT, max(arr[i],L-a

蚂蚁爬杆

问题: 解答: 伪代码如下: void CalcTime(double Length,// length of the stick double *XPos,//position of an ant,<=length int AntNum,  //number of ants double Speed, //speed of ants double &Min,//return value of the minimum time double &Max)//return value o

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

问题:有一根27厘米的细木杆,在第3厘米.7厘米.11厘米.18厘米.23厘米这五个位置上各有一只蚂蚁.木杆很细,不能同时通过两只蚂蚁.开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退.当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走.假设蚂蚁们每秒钟可以走一厘米的距离.编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间. 思路:因为没有告诉蚂蚁的初始朝向,所以要对初始化蚂蚁朝向.用0表示朝左,1表示朝右,用二进制00000(0)表示五只蚂蚁都是朝向左,然后每次加1,直到

Java-蚂蚁爬杆(面向对象编程思想)

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