A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© as604049322 金牌黑马   /  2015-3-17 00:25  /  1129 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


[code]package com.itheima;
/**
* 有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。
* 木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,
* 它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。 假设蚂蚁们每秒钟可以走一厘米的距离。
* 编写程序,求所有蚂蚁都离开木杆 的最小时间和最大时间。
*
* 分析: 当两只蚂蚁都掉头以后,我们把 a 蚂蚁看成 b 蚂蚁,把 b 蚂蚁看成 a 蚂蚁,
* 若不考虑它们的名字a,b,其实这和两只蚂蚁“擦肩而过”有什么区别呢? 也就是说,蚂蚁的碰撞根本不会影响“宏观”上五只蚂蚁的运动情况。
*
* @author 旋风铭
*
*/
public class AntOfTime {

1 个回复

正序浏览
  1. package com.itheima;

  2. /**
  3. * 有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。
  4. * 木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,
  5. * 它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。 假设蚂蚁们每秒钟可以走一厘米的距离。
  6. * 编写程序,求所有蚂蚁都离开木杆 的最小时间和最大时间。
  7. *
  8. * 分析: 当两只蚂蚁都掉头以后,我们把 a 蚂蚁看成 b 蚂蚁,把 b 蚂蚁看成 a 蚂蚁,
  9. * 若不考虑它们的名字a,b,其实这和两只蚂蚁“擦肩而过”有什么区别呢? 也就是说,蚂蚁的碰撞根本不会影响“宏观”上五只蚂蚁的运动情况。
  10. *
  11. * @author 旋风铭
  12. *
  13. */
  14. public class AntOfTime {
  15.         public static void main(String[] args) {
  16.                 int[] ant;
  17.                 int time;
  18.                 boolean[] left = { true, true, true, true, true };// 五只蚂蚁的方向是否向左
  19.                 boolean[] stillin;// 五只蚂蚁是否还在木杆上
  20.                 int mintime = 10000;
  21.                 int maxTime = 0;
  22.                 String minStr = null;
  23.                 String maxStr = null;
  24.                 String str = null;
  25.                 for (int i = 1; i < Math.pow(2, 5); i++) {
  26.                         //初始化
  27.                         time = 0;
  28.                         ant = new int[] { 3, 7, 11, 17, 23 };// 五只蚂蚁的位置
  29.                         stillin = new boolean[] { true, true, true, true, true };// 五只蚂蚁是否还在木杆上
  30.                        
  31.                         //产生代表蚂蚁方向的文本,(0代表向左,1代表向右)
  32.                         str = Integer.toBinaryString(i);
  33.                         str = str.replaceAll("([01]+)", "0000$1");
  34.                         str = str.replaceAll("0*([01]{5})", "$1");
  35.                        
  36.                         //下面的while循环模拟了五只蚂蚁从初始状态到全部离开木杆的全过程
  37.                         while (true) {
  38.                                 //str的五个字符分别代表了五只蚂蚁的运动方向
  39.                                 if (str.charAt(0) == '0')
  40.                                         ant[0]--;
  41.                                 else
  42.                                         ant[0]++;
  43.                                 if (str.charAt(1) == '0')
  44.                                         ant[1]--;
  45.                                 else
  46.                                         ant[1]++;
  47.                                 if (str.charAt(2) == '0')
  48.                                         ant[2]--;
  49.                                 else
  50.                                         ant[2]++;
  51.                                 if (str.charAt(3) == '0')
  52.                                         ant[3]--;
  53.                                 else
  54.                                         ant[3]++;
  55.                                 if (str.charAt(4) == '0')
  56.                                         ant[4]--;
  57.                                 else
  58.                                         ant[4]++;
  59.                                 //此时运动完成,耗时1秒
  60.                                 time++;
  61.                                
  62.                                 //判断蚂蚁是否已经离开木杆并记录
  63.                                 if (ant[0] <= 0 || ant[0] >= 27)
  64.                                         stillin[0] = false;
  65.                                 if (ant[1] <= 0 || ant[1] >= 27)
  66.                                         stillin[1] = false;
  67.                                 if (ant[2] <= 0 || ant[2] >= 27)
  68.                                         stillin[2] = false;
  69.                                 if (ant[3] <= 0 || ant[3] >= 27)
  70.                                         stillin[3] = false;
  71.                                 if (ant[4] <= 0 || ant[4] >= 27)
  72.                                         stillin[4] = false;
  73.                                
  74.                                 //如果全部都已经离开木杆则退出循环
  75.                                 boolean flag = false;
  76.                                 for (int j = 0; j < stillin.length; j++) {
  77.                                         flag = flag || stillin[j];
  78.                                 }
  79.                                 if (!flag)
  80.                                         break;
  81.                         }
  82.                        
  83.                         //获得该状态下蚂蚁全部离开所需要的时间
  84.                         if (maxTime < time) {
  85.                                 maxTime = time;
  86.                                 maxStr = str;
  87.                         }
  88.                         if (mintime > time) {
  89.                                 mintime = time;
  90.                                 minStr = str;
  91.                         }
  92.                 }
  93.                 System.out.println("最短时间:" + mintime + ",str=" + minStr);
  94.                 System.out.println("最长时间:" + maxTime + ",str=" + maxStr);

  95.         }
  96. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马