每段的过程都有相似性,用递归可以实现
public class MinGasStation {
public static int minGasStation(int numOfGS, int[] distOfGS,
int[] allowedGasoline, int distance,
int initialGasoline) {
//汽车跑不到加油站的情况
//途中没有加油站的情况
if(distOfGS==null){
if(initialGasoline < distance){
return -1;
}else{
return 0;
}
}
//途中有加油站的情况
if(initialGasoline>= distance){//汽车直接跑到终点不用加油
return 0;
}
if(initialGasoline<distOfGS[0]){//汽车跑不到加油站
return -1;
}
//当汽车跑到第一个加油站位置时
int curnumofGS = numOfGS-1;
//当前位置剩余加油站到当前加油站的距离
int[] curdistOfGS = null;
if(distOfGS.length>1){
curdistOfGS = new int[distOfGS.length-1];
for(int i = 1;i<distOfGS.length;i++){
curdistOfGS[i-1] = distOfGS[i]-distOfGS[0];
}
}
//当前剩余每个加油站可供汽油量的列表
int[] curallowedGasoline = null;
if(allowedGasoline.length>1){
curallowedGasoline = new int[allowedGasoline.length-1];
for(int i = 1;i<allowedGasoline.length;i++){
curallowedGasoline[i-1] = allowedGasoline[i];
}
}
//当前距离办公室的距离
int curdistance = distance-distOfGS[0];
//当前汽车中存汽油的初始值
int curinitialGasoline = initialGasoline- distOfGS[0];
//从当前加油站出发到终点需要停留的次数
//当前加油站停留加油
int addgas = minGasStation(curnumofGS,curdistOfGS,curallowedGasoline,curdistance,curinitialGasoline+allowedGasoline[0])+1;
//当前加油站不停留
int noaddgas = minGasStation(curnumofGS,curdistOfGS,curallowedGasoline,curdistance,curinitialGasoline);
if(addgas != 0 && noaddgas!=-1){
return addgas<noaddgas?addgas:noaddgas;
}else if(addgas == 0 && noaddgas!=-1){
return noaddgas;
}else if(addgas!=0 && noaddgas== -1){
return addgas;
}else{
return -1;
}
}
public static void main(String[] args) {
int numOfGS = 4;
int[] distOfGS = {5,7,8,10};
int[] allowedGasoline = {2,3,1,5};
int distance = 15;
int initialGasoline = 5;
System.out.println(minGasStation(numOfGS,distOfGS,allowedGasoline,distance,initialGasoline));
}
}