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

4 回答 4

1

将返回类型更改LasVegasboolean。删除对的调用System.exit()并将紧随其后的return;语句更改为return true;. 将递归调用更改为:

if (LasVegas(tablero, f+1, posReina)) return true;
于 2011-06-13T01:08:23.937 回答
1

您可以使函数返回布尔值

static bool LasVegas( ...

而不是Exitreturn falsetrue在另一种情况下返回。

同样,当递归调用函数时,只需检查结果,如果为 false,则返回 false:

       if (check(tablero, f)){
            if (!LasVegas(tablero, f+1, posReina))
                return false;
       }
于 2011-06-13T01:08:32.167 回答
0

用返回替换出口;
在一个while循环中你可以调用break;退出它

于 2011-06-13T01:05:25.877 回答
0

我在这里有一个很好的建议:

如果您完成了回溯并且不想继续。

  1. 创建一个静态或虚拟变量(布尔或整数)
  2. 完成后为其分配一些值(假设为 true 或 1)
  3. 检查回溯方法中的虚拟变量值并“返回”。

如果(完成)返回;// 这里所有的回溯方法都将简单地返回 true 给被调用的方法,并且什么也不做。重要的是这段代码应该在回溯方法的开头。

于 2018-01-19T13:50:39.670 回答