这是一个游戏时想出来解决问题的方法,第三关--有一家人,晚上要过一个独木桥。但是他们只有一盏灯,而这盏灯只能使用30秒了。要在灯熄灭前过这座桥,他们一家五口人每个人过桥的速度不同。瘦人1秒,小胖3秒,姑娘6秒,大胖8秒,瘸子12秒。 每次只能过两个人。过去后,对岸要有一个人再把灯送回来。有兴趣的朋友还可以链接“游戏”到网页,一共有5个益智游戏,希望大家能喜欢。我的思路是每次从未过桥的人中间随机选2个过桥,计时器增加,然后从已过桥的人随机找一个人送灯,计时器增加,所有的人都过桥了,计时超过30就重来。但是最后结果老出问题,查了很久也没找出为什么来。如果有更好的方法,请不吝赐教。
public class Game {
 int a[ ] = {1,3,6,8,12};     //每个人走路的速度
 boolean b[] ={false,false,false,false,false}; //为每个人设置一个状态,真为已过桥,假为未过桥
 int sum=0;                  //所花费的总时间,不能超过30S
 int ser[ ]={-1,-1,-1,-1,-1,-1,-1};

 /*过桥时有2个人*/
  boolean go( ){
     int i=0,j=0,k=0,check=0;   //check为检查未过桥人数的变量,大于2时才能一起过桥
    
     while(i<5 ){if(b[i]==false)check++;i++;}
    
     if(check>=2){
         i=(int) ( Math.random()*5);          
         j=(int) ( Math.random()*5);       //随机选2个人过桥
         if ( b[i]==false&&b[j]==false&&i!=j){
     b[i]=true;            
     b[j]=true;                     //如果过桥变量就为真
     while(ser[k]!=-1&&k<7)k++;ser[k]=i;
     while(ser[k]!=-1&&k<7)k++;ser[k]=j;     //把2个人过桥次序存入ser
    
     if(a[i]>a[j]) sum =sum+a[i];
     else sum=sum+a[j];
         return true;
         }
 
      }
return false;
}   /*送灯人返回*/
      void back(){
     int i=0,k=0;

while(true){
i=(int) (Math.random()*5);
if (b[i]==true){                   //
while(ser[k]!=-1&&k<7)k++;
ser[k]=i;
sum=sum+a[i];
b[i]=false;
break;
}
}

    }
    
    void result(){
       //先执行一次
     for(int i=0; i<3 ;i++){go();back();}
    go();
    //循环,直到得出结果
     while(sum>30){
     /*第一次执行不成功,初始化变量*/
       sum=0;
    for(int i=0; i<7 ;i++)ser[i]=0;
    for(int m=0 ;m<5 ;m++)b[m] =false;
    
    for(int i=0; i<3 ;i++){go();back();}  //又执行一次
         go();
         
       
     }
     for(int i=0; i<7; i++){System.out.println(ser[i]);}  //打印执行顺序
    }
public static void main(String[] args) {

Game game = new Game();

game.result();
}

}

解决方案 »

  1.   

    感觉代码问题应该出在过桥和回来的路上,你那里取随机数,如果取的随机数不满足下面的if,就会直接return false了,取随机数的时候应该:如果不满足要求应该继续取,必须保证过桥的时候一过一回。先写下,回来再想。
      

  2.   

    lz写程序的习惯不好啊,该写的大括号还是必需的。
    另外while(ser[k]!=-1&&k<7)会出异常的啊,应该反过来吧
      

  3.   

    我感觉那个ser【】数组有问题,那个数组应该是记录过桥和回来的顺序。按楼主的算法有3次back()和4次go(),总共加起来有11个次序,把ser长度设为7是不够的。另外3楼说的也问题也确实存在,先写到这了,待会有时间的话把改好的代码发上来
      

  4.   

    非常感谢各位的帮助,尤其是5楼与9楼,还有是3楼的提示。
    while(ser[k]!=-1&&k <7)确实会出现溢出的可能,
    也存在9楼说的ser[k]数组设置太小的原因,当时就是确定7个单元,大意了,应该是11个单元。
    3楼的提示非常有用,问题就是出现在go()方法的if(check>=2)上,应该用while循环,如果里边随机不成功可以继续再找。
    能运行的程序已经出来了。如果还有穷举或者其他更优越的方法,请不吝赐教。
    public class Game {
     int a[ ] = {1,3,6,8,12};     //每个人走路的速度
     boolean b[] ={false,false,false,false,false}; //为每个人设置一个状态,真为已过桥,假为未过桥
     int sum=0;                  //所花费的总时间,不能超过30S
     int ser[ ]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};   //此处有改动

     /*过桥时有2个人*/
     boolean go( ){
          int i=0,j=0,k=0,check=0;   //check为检查未过桥人数的变量,大于2时才能一起过桥
        
          while(i<5 ){if(b[i]==false)check++;i++;}
        
          while(check>=2){                       //此处有改动
               i=(int) ( Math.random()*5);          
               j=(int) ( Math.random()*5);       //随机选2个人过桥
                if ( b[i]==false&&b[j]==false&&i!=j){
         b[i]=true;            
         b[j]=true;                     //如果过桥变量就为真
         while(k<11&&ser[k]!=-1)k++;ser[k]=i;      //此处有改动
         while(k<11&&ser[k]!=-1)k++;ser[k]=j;     //把2个人过桥次序存入ser
        
         if(a[i]>a[j]) sum =sum+a[i];
         else sum=sum+a[j];
             return true;
             }
     
          }
    return false;
    }   /*送灯人返回*/
          void back(){
         int i=0,k=0;

    while(true){
    i=(int) (Math.random()*5);
    if (b[i]==true){                   //
    while(k<11&&ser[k]!=-1)k++;
    ser[k]=i;
    sum=sum+a[i];
    b[i]=false;
    break;
    }
    }

        }
        
        void result(){
           //先执行一次
         for(int i=0; i<3 ;i++){go();back();}
        go();
        //循环,直到得出结果
         while(sum>30){
         /*第一次执行不成功,初始化变量*/
           sum=0;
        for(int i=0; i<11 ;i++)ser[i]=-1;
        for(int m=0 ;m<5 ;m++)b[m] =false;
        
        for(int i=0; i<3 ;i++){go();back();}  //又执行一次
             go();
             
           
         }
         for(int i=0; i<11; i++){System.out.println(ser[i]);}  //打印执行顺序
        }
    public static void main(String[] args) {

    Game game = new Game();

    game.result();
    }

    }