zoukankan      html  css  js  c++  java
  • 八皇后问题求解java(回溯算法)

    八皇后问题

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

    代码实现

    static int count = 0;//记录有几种方法
    int max = 8;//max表示几个皇后
    int[] arr = new int[max];//用一个数组表示,其中arr[n]表示放在第arr[n]+1列,n表示第n+1个皇后,放在第n+1行
    public static void main(String[] args) {
        EightQueen queen = new EightQueen();
        queen.store(0);
        System.out.printf("一共有%d种放置方法",count);
    }
    
    //在棋盘上放置第几个皇后
    private void store(int n){
        if (n == 8){ //如果所有皇后放置完毕,则输出
            print();
            return;
        }
        for (int i = 0; i < max; i++) {
            arr[n] = i;
            if (Judg(n)){//判断是否与前面放置的有冲突
                store(n + 1);
            }
        }
    
    
    }
    
    private boolean Judg(int n){
        for (int i = 0; i < n; i++) {
            //arr[i] == arr[n] 表示是否在同一列
            //Math.abs(n - i) == Math.abs(arr[n] - arr[i]) 表示是否在同一斜线
            if (arr[i] == arr[n] || Math.abs(n - i) == Math.abs(arr[n] - arr[i])){
                return false;
            }
        }
        return true;
    }
    
    //用于显示八皇后的位置
    private void print(){
        count++;
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + 1 + " ");
        }
        System.out.println();
    }
  • 相关阅读:
    八数码难题 (codevs 1225)题解
    小木棍 (codevs 3498)题解
    sliding windows (poj 2823) 题解
    集合删数 (vijos 1545) 题解
    合并果子 (codevs 1063) 题解
    等价表达式 (codevs 1107)题解
    生理周期 (poj 1006) 题解
    区间 (vijos 1439) 题解
    区间覆盖问题 题解
    种树 (codevs 1653) 题解
  • 原文地址:https://www.cnblogs.com/z-tao/p/12521039.html
Copyright © 2011-2022 走看看