一维数组实现八皇后问题

八皇后问题:

  • 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于 1848 年提出:在 8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、 同一列或同一斜线上,问有多少种摆法(92)。
    一维数组实现八皇后问题_第1张图片

解析思路:

  1. 第一个皇后先放第一行第一列
  2. 第二个皇后放在第二行第一列、然后判断是否 OK, 如果不 OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适
  3. 继续第三个皇后,还是第一列、第二列……直到第 8 个皇后也能放在一个不冲突的位置,算是找到了一个正确解
  4. 当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解, 全部得到
  5. 然后回头继续第一个皇后放第二列,后面继续循环执行 1,2,3,4 的步骤

说明: 理论上应该创建一个二维数组来表示棋盘,但是实际上可以通过算法,用一个一维数组即可解决问题.arr[8]= {0,4,7,5,2,6,1,3} //对应 arr 下标 表示第几行,即第几个皇后,arr[i] =val , val 表示第 i+1 个皇后,放在第 i+1 行的第 val+1 列

代码实现:

package com.sai.recursion;

/**
 * @Author sai
 * @Description 八皇后问题
 * @Time 2020-07-13 16:39
 */
public class Queen8 {

    //创建一个变量,表示共有多少个皇后
    int max = 8;
    //创建一维数组,存放皇后放置位置的结果    {0,4,7,5,2,6,1,3}
    int[] arr = new int[max];
    //查看一个都多少种方法
    static int count = 0;

    public static int getCount() {
        return count;
    }

    //依次放入皇后
    //每一次递归时,进入到push中都有  for(int i = 0; i < max; i++),因此会有回溯
    public void push(int n){

        if(n == max){  //n==8,表示八个皇后摆放完毕了
            print();
            return;
        }

        //依次放入皇后,并判断是否冲突
        for (int i = 0;i < max;i++){
               arr[n] = i;  //摆放

               if(isConflict(n)){  //判断是否冲突
                   push(n+1);  //不冲突,接着放n+1个皇后,即开始递归
               }

        }
    }

    //判断是否冲突
    public Boolean isConflict(int n){

        for (int i = 0;i < n;i++) {

            //  arr[n] == arr[i]  判断是否在同一列
            //  Math.abs(n-i) == Math.abs(arr[n]-arr[i])  判断是否在同一斜线上
            if (arr[n] == arr[i] || Math.abs(n-i) == Math.abs(arr[n]-arr[i])){
                return false;
            }
        }
        return true;
    }

    //遍历数组,输出摆放好的位置
    public void print(){

        for (int i = 0;i;i++) {
            System.out.print(arr[i] + " ");
        }
        count++;
        System.out.println();
    }

}

测试类:

package com.sai.recursion;

/**
 * @Author sai
 * @Description 八皇后问题的测试类
 * @Time 2020-07-13 16:39
 */
public class Queen8_Test {
    public static void main(String[] args) {
        Queen8 queen = new Queen8();

        //依次摆放八皇后
        queen.push(0);

        System.out.println("一共有" + queen.getCount() + "种方法");
    }
}

你可能感兴趣的:(算法,数据结构)