一、满n叉树模型
1、解的形式(x1,x2,x3,x4…xn)
X1:下标表示第1行
X1:值表示列的索引
2、解空间的组织结构-满n叉树
3、搜索条件
第i个皇后,第i列,值为xi
第j个皇后,第j列,值为xj
约束条件为:I ==j || abs(j – i) == abs(xi – xj)
4、搜索
public void calQueenCase2(int n) {
if (n == QUEENS) {
nums++;
} else {
for (int i = n; i < QUEENS; i++) {
array[n] = a[i];
swap(a, n, i);
if (judge2(n)) {
calQueenCase2(n + 1);
}
swap(array, i, n);
}
}
}
5、程序源码
public class EightQueens {
private static final int QUEENS = 8;
private static int[] array = new int[QUEENS];
private static int nums = 0;
public void calQueensCase(int n) {
if (n == QUEENS) {
nums++;
return;
}
for (int i = 0; i < QUEENS; i++) {
array[n] = i;
if (judge(n)) {
calQueensCase(n + 1);
}
}
}
private boolean judge(int n) {
for (int j = 0; j < n; j++) {
if (array[n] == array[j] || Math.abs(n - j) == Math.abs(array[n] - array[j])) {
return false;
}
}
return true;
}
public static void main(String[] args) {
EightQueens t = new EightQueens();
t.calQueensCase(0);
System.out.println(nums);
}
}
6、测试数据
(1)八皇后问题
可以看出八皇后问题一共由92中解法
(2)四皇后问题
可以看出四皇后问题一共由2中解法
7、结果分析
经分析结果正确,时间复杂度为n^n
二、排列树模型
1、解的形式(x1,x2,x3,x4,…xn)
X1:下标表示第一个数据
X1:该值表示第一个数据的排列值
2、解空间的组织结构
(这是一颗排序树,它的深度为4)
3.搜索条件
(Math.abs(n - j) == Math.abs(array[n] - array[j]))
4.搜索
public void calQueenCase2(int n) {
if (n == QUEENS) {
nums++;
} else {
for (int i = n; i < QUEENS; i++) {
array[n] = a[i];
swap(a, n, i);
if (judge2(n)) {
calQueenCase2(n + 1);
}
swap(array, i, n);
}
}
}
5.程序源码
package com.zsh.algorithm.leetcode.dfs;
/**
* @author:Ronin
* @since:2021/11/16
* @email:1817937322@qq.com
*/
public class EightQueens {
private static final int QUEENS = 4;
private static int[] array = new int[QUEENS];
int[] a = { 1, 2 ,3 ,4 };
private static int nums = 0;
/**
* 使用排列树模型
* @param n
*/
public void calQueenCase2(int n) {
if (n == QUEENS) {
nums++;
} else {
for (int i = n; i < QUEENS; i++) {
array[n] = a[i];
swap(a, n, i);
if (judge2(n)) {
calQueenCase2(n + 1);
}
swap(array, i, n);
}
}
}
private boolean judge2(int n) {
for (int j = 0; j < n; j++) {
if (Math.abs(n - j) == Math.abs(array[n] - array[j])) {
return false;
}
}
return true;
}
public void swap(int[] a, int i, int j) {
int tem = a[i];
a[i] = a[j];
a[j] = tem;
}
public static void main(String[] args) {
EightQueens t = new EightQueens();
t.calQueenCase2(0);
System.out.println(nums);
}
}
6、测试数据
(1)八皇后问题
可以看出八皇后问题一共由92中解法
(2)四皇后问题
可以看出四皇后问题一共由2中解法
7、结果分析
经分析结果正确,时间复杂度为(n!)
三、对比分析
经分析满n叉树的时间复杂度为n^n,经排列树优化之后为n!,时间复杂度大大降低。
测试真实时间:
(1)使用满二叉树
(2)使用排列树
((152+151+152)-(86+88+91))/(152+151+152)= 41.8%
可以得出使用排列树比满n叉树性能提升了41.8%