这是一个游戏时想出来解决问题的方法,第三关--有一家人,晚上要过一个独木桥。但是他们只有一盏灯,而这盏灯只能使用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();
}
}
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();
}
}
另外while(ser[k]!=-1&&k<7)会出异常的啊,应该反过来吧
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();
}
}