日期:2014-05-20  浏览次数:20622 次

本人已经把过桥问题的穷举排列实现了,就是不好实现过桥时间计算.请高手指点迷津.
package   org.liyu.testbrige;

import   java.util.ArrayList;

public   class   TestBrige
{
/*
  *   天黑,雨,四人欲过一座桥.桥破旧,每次最多能容两人同时通过.且只有一支手电(过桥必须用手电).
  *   甲单独过桥需1分钟,乙需2分钟,丙需5分钟,丁需7分钟.
  *   则四人全部通过的最短时间是多少?
  */
static   void   cnttime(ArrayList   param)
{
ArrayList   temparray   =   new   ArrayList();

for(int   i   =   0;   i   <   param.size();i++)
{
temparray.clear();
temparray.addAll(param);
temparray.remove(i);
iteratortime(param.get(i).toString(),temparray);
}
}

static   void   iteratortime(String   retvalue,ArrayList   param)
{
ArrayList   temparray   =   new   ArrayList();

for(int   i   =   0;   i   <   param.size();i++)
{
temparray.clear();
temparray.addAll(param);
temparray.remove(i);

System.out.print( "当前组合: "   +   retvalue   +   "和 "   +   param.get(i)   +   "> > > ");
System.out.print( "到对岸: "   +   param.get(i)   +   "&&& ");
System.out.println( "返回: "   +   retvalue);
iteratortime(retvalue,temparray);

//param.size()   >   1是为了避免最后一组的交换
if(param.size()   >   1)
{
System.out.print( "当前组合: "   +   retvalue   +   "与 "   +   param.get(i)   +   "> > > ");
System.out.print( "到对岸: "   +   retvalue   +   "&&& ");
System.out.println( "返回: "   +   param.get(i));
iteratortime(param.get(i).toString(),temparray);
}
if(param.size()   ==   1)
{
System.out.println( "one   over ");
}
}
}

public   static   void   main(String[]   args)
{
ArrayList   param   =   new   ArrayList();
param.add( "10 ");
param.add( "2 ");
param.add( "5 ");
param.add( "7 ");
cnttime(param);
}

}

------解决方案--------------------
16分钟
------解决方案--------------------
这种题口算也行吧:

甲单独过桥需1分钟,乙需2分钟,丙需5分钟,丁需7分钟.

甲和丁过桥 7分钟
甲带手电回来 1分钟
甲和丙过桥 5分钟
甲带手电回来 1分钟
甲和乙过桥 2分钟
---------------------
共计 16分钟