Как я могу остановить этот возврат без использования System.exit (0)? - PullRequest
0 голосов
/ 13 июня 2011
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 ]

1 голос
/ 13 июня 2011

Измените тип возврата LasVegas на boolean.Удалите вызов на System.exit() и измените непосредственно следующий оператор return; на return true;.Измените рекурсивный вызов на:

if (LasVegas(tablero, f+1, posReina)) return true;
1 голос
/ 13 июня 2011

Вы можете сделать функцию возврата bool

static bool LasVegas( ...

и вместо Exit возврат false. Верните true в другом случае.

Также при рекурсивном вызове функции просто проверяйте результат и, если false, возвращается false:

       if (check(tablero, f)){
            if (!LasVegas(tablero, f+1, posReina))
                return false;
       }
0 голосов
/ 19 января 2018

У меня есть хорошее предложение здесь:

Если вы закончили с возвратом и не хотите продолжать.

  1. создать статическую или фиктивную переменную (логическое или int)
  2. как только вы закончите, присвойте ему некоторое значение (скажем, true или 1)
  3. Проверьте значение фиктивной переменной в методе Backtrack и нажмите «return».

если (сделано) вернуть; // Здесь все методы возврата будут просто возвращать true вызываемому и ничего не делать. Важно то, что этот фрагмент кода должен находиться в начале метода возврата.

0 голосов
/ 13 июня 2011

заменить выход на возврат;в цикле while вы можете вызвать break;выйти из нее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...