Как я могу остановить этот возврат без использования System.exit(0)?
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)
чтобы я мог вызывать его несколько раз в цикле?
4 ответа
Изменить тип возврата LasVegas
в boolean
, Удалить звонок System.exit()
и изменить сразу после return;
заявление к return true;
, Измените рекурсивный вызов на:
if (LasVegas(tablero, f+1, posReina)) return true;
Вы можете сделать функцию возврата bool
static bool LasVegas( ...
и вместо Exit
вернуть false
, Вернуть true
в другом случае.
Также при рекурсивном вызове функции просто проверяйте результат, а если false, возвращайте false:
if (check(tablero, f)){
if (!LasVegas(tablero, f+1, posReina))
return false;
}
Заменить выход на возврат;
в цикле while вы можете вызвать break; выйти из него
У меня есть хорошее предложение здесь:
Если вы закончили с возвратом и не хотите продолжать.
- создать статическую или фиктивную переменную (логическое или int)
- как только вы закончите, присвойте ему некоторое значение (скажем, true или 1)
- Проверьте значение фиктивной переменной в методе Backtrack и нажмите "return".
если (сделано) вернуть; // Здесь все методы возврата будут просто возвращать true вызываемому и ничего не делать. Важно то, что этот фрагмент кода должен находиться в начале метода возврата.