n皇后,排列树

来源:互联网 发布:js获取今天年月日 编辑:程序博客网 时间:2024/09/21 06:35
package com.alo.offer;public class WolfQueen {    /**     * 一共有多少个皇后(此时设置为8皇后在8X8棋盘,可以修改此值来设置N皇后问题)     */    int max = 8;    /**     * 该数组保存结果,第一个皇后摆在array[0]列,第二个摆在array[1]列     */    int[] array = new int[max];    public static void main(String[] args) {        new WolfQueen().check(0);    }    /**     * n代表当前是第几个皇后     * @param n     * 皇后n在array[n]列     */    int []a = {0,1,2,3,4,5,6,7};    private void check(int n) {        //终止条件是最后一行已经摆完,由于每摆一步都会校验是否有冲突,所以只要最后一行摆完,说明已经得到了一个正确解        if (n == max) {            print();            return;        }        //从第一列开始放值,然后判断是否和本行本列本斜线有冲突,如果OK,就进入下一行的逻辑        for (int i = n; i < max; i++) {        array[n] = a[i];        swap(a,n,i);            if (judge(n)) {                check(n + 1);            }            swap(a,n,i);        }    }    private void swap(int []a,int i,int j) {// TODO Auto-generated method stub    int temp=a[i];    a[i]=a[j];    a[j]=temp;}private boolean judge(int n) {        for (int i = 0; i < n; i++) {            if ( Math.abs(n - i) == Math.abs(array[n] - array[i])) {                return false;            }        }        return true;    }int k=0;    private void print()  {    ++k;    System.out.print("这是第"+k+"种解法");        for (int i = 0; i < array.length; i++) {            System.out.print(array[i] + 1 + " ");        }        System.out.println();    }}

原创粉丝点击