【发布时间】:2017-03-29 10:12:52
【问题描述】:
我对顺序搜索有疑问,这是练习:
您正在测试一种砖的物理耐力。进行测试是为了找到砖块在不破坏 N 层建筑物的情况下可以掉落的最大高度。你有 k 块积木和两个箱子:
案例 1。当 k = 1 时,尝试从当前楼层开始,依次向上,直到砖块破裂。
案例 2。对于 k > 1,一块砖从 N/2 层掉落。如果它中断,则在楼层 1 和 N/2 -1 之间再次应用案例 2。如果砖没有破裂,则在 N/2 + 1 层和 N 层之间再次应用案例 2。
我对 CASE 1 的原因有疑问,因为我不知道如何处理它:
最初你调用 dropBricks(k,1,N);为k,N由用户(键盘)引入。
public static boolean breakingFloor(int floor){
boolean breaks;
Random r =new Random();
int breakingFloor= r.nextInt(floor)+1;
if(floor>=breakingFloor){
breaks=true;
}else{
breaks=false;
}
return breaks;
}
dropBricks 接收 k(剩余砖块数, first (first floor),last (last floor = N)) 并且输出将是 brokenFloor
public static int dropBricks(int k,int first,int last){
int result=0;
if (k==1){//CASE 1
//I KNOW THIS CODE IS WRONG, IS JUST O NOT LEAVE IT IN EMPTY
do{
dropBricks(k,first,last);
first++;
}while(breakingFloor(first));
System.out.println("Floor brick broke "+floor);
}else{//CASE 2
if(last-first<=1){
if(last==first){
result=first;
System.out.println("Floor brick broke "+result);
}else{
if(breakingFloor(first)){
result=first;
k--;
System.out.println("Floor brick broke "+result);
}else{
result=last;
k--;
System.out.println("Floor brick broke "+result);
}
}
}else{
int mid=((first+last)/2);
if(breakingFloor(mid)){
result=dropBricks(k-1,first,mid);
System.out.println("Floor brick broke "+result);
}else{
result=dropBricks(k,mid,last);
System.out.println("Floor brick broke "+result);
}
}
}
return result;
}
【问题讨论】: