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
- n皇后问题-java版
- N皇后问题【Java】
- 【java】N皇后问题
- N-Queens(N皇后问题) --Java版
- N皇后问题 java程序
- java实现N皇后问题
- n皇后问题求解 java
- N皇后问题,java实现
- Java解决N皇后问题
- N*N皇后问题
- n皇后问题java递归实现
- n皇后问题java回溯实现
- hdu 2553 N皇后问题<java>
- java数组实现N皇后问题
- JAVA实现N皇后问题(回溯法)
- java分治算法实现n皇后问题
- Java实现-N皇后问题1
- Java实现-N皇后问题2
- linux进程优先级、进程nice值(转载)
- Gabor filter可视化项目报告
- [Java] 不使用第三个变量实现两个整数类型变量互换(异或运算符)
- C#新手入门代码 泛型类的静态字段的实例
- caffe学习笔记(一)
- n皇后问题-java版
- 轻院OJ-1912 小火山的爱情密码(尺取法)
- [codevs3269] 混合背包
- 设计模式-单例模式
- zzuliOJ 1905:小火山的跳子游戏(GCD+思维)
- HDU 3172 Virtual Friends 并查集+map
- java数组使用equals()方法报空指针问题
- 训练第五周之最小生成树
- mac下编译protobuf 3.0