n皇后问题-java版

来源:互联网 发布:交大知行大厦地址 编辑:程序博客网 时间:2024/05/18 03:03

题目

对于一个n*n的棋盘,给定n个皇后,求每个皇后的位置,其中要求每个皇后在八个方向上是唯一存在的

思路

对n*n的棋盘使用图的深度优先收索求解,注意剪枝

代码

import java.util.ArrayList;/** * 对于一个n*n的棋盘,给定n个皇后,求每个皇后的位置,其中要求每个皇后在八个方向上是唯一存在的 */public class NQueue {    public static void main(String[] args) {        int n = 8;// 皇后的数量        int[] queen = new int[n];// queen[i]=j表示第i个皇后占据第j列        //结果集        ArrayList<String> res = new ArrayList<String>();         int[] a0 = new int[2 * n]; // 记录45度对角线是否皇后        int[] a1 = new int[2 * n]; // 记录-45度对角线是否皇后        int[] colum = new int[n];  //记录第j列是否皇后        f1(res, queen, colum, a0, a1, 0);        System.out.println("共有:"+res.size()+"种不同方案\n分别为:");        for (int i = 0; i < res.size(); i++) {            System.out.println(res.get(i));        }    }    // row表示为第row个皇后    private static void f1(ArrayList<String> res, int[] queen, int[] colum,            int[] a0, int[] a1, int row) {        if (row == queen.length) {            // 找到结果            StringBuffer s = new StringBuffer();            for (int i = 0; i < queen.length; i++) {                s.append(queen[i] + " ");            }            res.add(s.toString());            return;        }        for (int j = 0; j < queen.length; j++) {            if (!isOccupy(queen, colum, a0, a1, row, j)) {                continue;            }            // 先占位,再判断是否符合题意            queen[row] = j;            update(colum, a0, a1, row, j, 1);            f1(res, queen, colum, a0, a1, row + 1);            // queen[row] = j;不满足题意,则回溯            queen[row] = 0;            update(colum, a0, a1, row, j, 0);        }    }    private static void update(int[] colum, int[] a0, int[] a1, int row, int j,            int value) {        colum[j] = value;        a0[row + j] = value;        a1[row - j + colum.length - 1] = value;    }    private static boolean isOccupy(int[] queen, int[] colum, int[] a0,            int[] a1, int row, int j) {        return queen[row] == 0 && colum[j] == 0 && a0[row + j] == 0                && a1[row - j + colum.length - 1] == 0;    }}

结果:

共有:92 种不同方案分别为:0 4 7 5 2 6 1 3 0 5 7 2 6 3 1 4 0 6 3 5 7 1 4 2 0 6 4 7 1 3 5 2 1 3 5 7 2 0 6 4 1 4 6 0 2 7 5 3 1 4 6 3 0 7 5 2 1 5 0 6 3 7 2 4 1 5 7 2 0 3 6 4 1 6 2 5 7 4 0 3 1 6 4 7 0 3 5 2 1 7 5 0 2 4 6 3 2 0 6 4 7 1 3 5 2 4 1 7 0 6 3 5 2 4 1 7 5 3 6 0 2 4 6 0 3 1 7 5 2 4 7 3 0 6 1 5 2 5 1 4 7 0 6 3 2 5 1 6 0 3 7 4 2 5 1 6 4 0 7 3 2 5 3 0 7 4 6 1 2 5 3 1 7 4 6 0 2 5 7 0 3 6 4 1 2 5 7 0 4 6 1 3 2 5 7 1 3 0 6 4 2 6 1 7 4 0 3 5 2 6 1 7 5 3 0 4 2 7 3 6 0 5 1 4 3 0 4 7 1 6 2 5 3 0 4 7 5 2 6 1 3 1 4 7 5 0 2 6 3 1 6 2 5 7 0 4 3 1 6 2 5 7 4 0 3 1 6 4 0 7 5 2 3 1 7 4 6 0 2 5 3 1 7 5 0 2 4 6 3 5 0 4 1 7 2 6 3 5 7 1 6 0 2 4 3 5 7 2 0 6 4 1 3 6 0 7 4 1 5 2 3 6 2 7 1 4 0 5 3 6 4 1 5 0 2 7 3 6 4 2 0 5 7 1 3 7 0 2 5 1 6 4 3 7 0 4 6 1 5 2 3 7 4 2 0 6 1 5 4 0 3 5 7 1 6 2 4 0 7 3 1 6 2 5 4 0 7 5 2 6 1 3 4 1 3 5 7 2 0 6 4 1 3 6 2 7 5 0 4 1 5 0 6 3 7 2 4 1 7 0 3 6 2 5 4 2 0 5 7 1 3 6 4 2 0 6 1 7 5 3 4 2 7 3 6 0 5 1 4 6 0 2 7 5 3 1 4 6 0 3 1 7 5 2 4 6 1 3 7 0 2 5 4 6 1 5 2 0 3 7 4 6 1 5 2 0 7 3 4 6 3 0 2 7 5 1 4 7 3 0 2 5 1 6 4 7 3 0 6 1 5 2 5 0 4 1 7 2 6 3 5 1 6 0 2 4 7 3 5 1 6 0 3 7 4 2 5 2 0 6 4 7 1 3 5 2 0 7 3 1 6 4 5 2 0 7 4 1 3 6 5 2 4 6 0 3 1 7 5 2 4 7 0 3 1 6 5 2 6 1 3 7 0 4 5 2 6 1 7 4 0 3 5 2 6 3 0 7 1 4 5 3 0 4 7 1 6 2 5 3 1 7 4 6 0 2 5 3 6 0 2 4 1 7 5 3 6 0 7 1 4 2 5 7 1 3 0 6 4 2 6 0 2 7 5 3 1 4 6 1 3 0 7 4 2 5 6 1 5 2 0 3 7 4 6 2 0 5 7 4 1 3 6 2 7 1 4 0 5 3 6 3 1 4 7 0 2 5 6 3 1 7 5 0 2 4 6 4 2 0 5 7 1 3 7 1 3 0 6 4 2 5 7 1 4 2 0 6 3 5 7 2 0 5 1 4 6 3 7 3 0 2 5 1 6 4 
0 0