八皇后问题(回溯算法)

八皇后问题介绍:(共92中解法)
八皇后问题(回溯算法)_第1张图片
问题思路分析:
八皇后问题(回溯算法)_第2张图片
当我们放置第n个皇后时,就要查看当前皇后是否和之前的皇后冲突,要进行判断

需要着重理解的判断条件是:

private boolean judge(int n) {
        for (int i = 0; i < n; i++) {
            if (arr[n] == arr[i] || Math.abs(n - i) == Math.abs(arr[n] - arr[i])) {
                return false;
            }
        }
        return true;
    }
  • arr[ n ] == arr[ i ]表示第n个皇后是否和前面的n-1个皇后位于同一列
  • Math.abs( n - i) == Math.abs( arr[n] - arr[i] )判断两个皇后是否在同一斜线
  • 判断是否在同一行是没有必要的,因为行号由数组的下标表示,在for循环中下标是递增的,不会相同

代码实现

package demo;

//八皇后问题
public class Queen {
    int max = 8;//皇后的数量

    int[] arr = new int[max];//保存皇后的位置

    static int count = 0;//共有多少种解法
    static int judgecount = 0;//共进行多少次判断
    public static void main(String[] args) {
        Queen queen = new Queen();
        queen.check(0);
        System.out.printf("一共有%d中解法\n",count);
        System.out.printf("一共遍历%d次",judgecount);
    }

    //打印皇后存放位置
    private void print() {
        count++;
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

    private boolean judge(int n) {
        judgecount++;
        for (int i = 0; i < n; i++) {
            if (arr[n] == arr[i] || Math.abs(n - i) == Math.abs(arr[n] - arr[i])) {
                return false;
            }
        }
        return true;
    }

    private void check(int n){
        if(n == max){
            print();
            return;
        }
        for (int i = 0; i < max; i++) {
            arr[n] = i;
            if(judge(n)){
                check(n+1);
            }

        }
    }
}

从输出情况来看回溯法的效率并不是很高,需要进行判断多大一万多次,后面应该还会遇到更加高效的解决办法。

你可能感兴趣的:(一点一点学算法)