static void LasVegas(int []tablero, int f, int ultimaReina){
HashSet<Integer> enterosUsados = new HashSet<Integer>();
if (ultimaReina!=-1) enterosUsados.add(ultimaReina);
if ((ultimaReina-1) >=0){enterosUsados.add(ultimaReina-1);}
if ((ultimaReina+1 != tablero.length) && (ultimaReina!=-1)){enterosUsados.add(ultimaReina+1);}
// if(ultimaReina+1!=tablero.length){enterosUsados.add(ultimaReina+1);}
Random random = new Random();
int posReina;
if (f==tablero.length){
printBoard(tablero);
stop=System.currentTimeMillis();
System.out.println(stop-start);
System.exit(0);
return;
}
do {
do{
posReina= Math.abs(random.nextInt())%tablero.length;
}
while(enterosUsados.add(posReina)==false);
tablero[f]=posReina;
if (check(tablero, f)){
LasVegas(tablero, f+1, posReina);
}
} while (enterosUsados.size()<tablero.length);
}
public static void main(String[] args) {
// testChiCuadrado(410,30);
int [] tablero = new int[8];
Arrays.fill(tablero, -1);
start = System.currentTimeMillis();
LasVegas(tablero, 0, -1);
}
static boolean check (int [] array, int f){
for (int i=0; i<f; i++){
if (array[i]==array[f]) return false;
if( Math.abs(array[f]-array[i])== Math.abs(f-i)) return false;
} return true;
}
static void printBoard(int [] tablero) {
char [] linea = new char[tablero.length];
Arrays.fill(linea, '*');
for (int i=0;i<tablero.length;i++){
linea[tablero[i]]='D';
System.out.println(new String(linea));
linea[tablero[i]]='*';
}
}
我正在使用拉斯维加斯算法在棋盘上生成随机皇后位置,我想通过多次运行来计算它的时间,但我正在使用System.exit(0)
来阻止回溯时解决方案是发现,如果我不停在那里,我的算法会给出其他解决方案,这是我不想要的。
下面:
if (f==tablero.length){
printBoard(tablero);
stop=System.currentTimeMillis();
System.out.println(stop-start);
System.exit(0);
return;
}
如何更改它并使算法在没有System.exit(0)
的情况下停止,以便我可以在循环内多次调用它?
答案 0 :(得分:1)
将LasVegas
的返回类型更改为boolean
。移除对System.exit()
的调用,并将紧随其后的return;
语句更改为return true;
。将递归调用更改为:
if (LasVegas(tablero, f+1, posReina)) return true;
答案 1 :(得分:1)
你可以让函数返回bool
static bool LasVegas( ...
而不是Exit
返回false
。在另一种情况下返回true
。
同样,在递归调用函数时只检查结果,如果为false,则返回false:
if (check(tablero, f)){
if (!LasVegas(tablero, f+1, posReina))
return false;
}
答案 2 :(得分:0)
用退货代替退货;
在while循环中你可以调用break;退出
答案 3 :(得分:0)
我在这里有一个很好的建议:
如果您完成了回溯,并且您不想继续。
if(done)return; //这里所有的回溯方法都只会返回true给被调用的方法而什么都不做。重要的是这段代码应该在回溯方法的开头。