回溯法(九宫格、八皇后)

九宫格

    /*
    规则
1.把1放到第一行的中间
2.开始向右上角放入后面的数字,如果右上是空的直接填 如果右上已经填过了 直接填在当前位置的下面
    */
    public static int n=5;
    public static int[][] array=new int[n][n];
    //逻辑
    public static void squaredUp(int[][] array){
        int x=1;//要填入的数据
        //定义起始位置
        int row=0;
        int col=n/2;
        array[row][col]=1;
        //开始填写后面的数据
        while(x<n*n){
            //在选择下一位置的时候,先记录下现在的位置
            int tempRow=row;
            int tempCol=col;
            //向右上移动
            row--;
            if(row<0){
                row=n-1;
            }
            col++;
            if(col==n){
                col=0;
            }
            x++;
            if(array[row][col]==0){//如果右上没填,直接填入
                array[row][col]=x;
            }else{//如果没填,就放到当前位置的下面
                //还原
                row=tempRow;
                col=tempCol;
                row++;
                array[row][col]=x;
            }
        }

    }

八皇后问题

 //下标表示行号    值表示列号
    public static int[] array=new int[8];
    /**
     * 处理八个皇后的问题
     */
    public static void eightQueens(){
        eightQueens(0);
    }
    public static void eightQueens(int row){
        //如果有结果了就退出
        if(row==8){
            printResult();
            System.out.println("---------");
            return;
        }

        //开始从第一列到最后一列一个个放入
        for(int col=0;col<8;col++){
            array[row]=col;
            if(judge(row)){//判断是否可以放入
                eightQueens(row+1);//就开始下一行
            }
        }
    }

    /**
     * 判断当前列放入的位置是否和以前放过的内容有冲突
     */
    public static boolean judge(int n){//n=4
        for(int i=0;i<n;i++){
            //条件1  array[i]==array[n]  在一列上
            //条件2  abs(n-i)==abs(array[n]-array[i])
            if(array[i]==array[n] || Math.abs(n-i)==Math.abs(array[n]-array[i])){
                return false;
            }
        }
        return true;
    }
    public static void printResult(){
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }

 

    原文作者:九宫格问题
    原文地址: https://blog.csdn.net/hxl517116279/article/details/85726890
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞