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