0
点赞
收藏
分享

微信扫一扫

实验五:搜索法实验(n皇后问题)


一、满n叉树模型
1、解的形式(x1,x2,x3,x4…xn)
X1:下标表示第1行
X1:值表示列的索引

2、解空间的组织结构-满n叉树

实验五:搜索法实验(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)八皇后问题

实验五:搜索法实验(n皇后问题)_搜索法_02


可以看出八皇后问题一共由92中解法

实验五:搜索法实验(n皇后问题)_时间复杂度_03

(2)四皇后问题

实验五:搜索法实验(n皇后问题)_时间复杂度_04


可以看出四皇后问题一共由2中解法

实验五:搜索法实验(n皇后问题)_时间复杂度_05

7、结果分析
经分析结果正确,时间复杂度为n^n

二、排列树模型
1、解的形式(x1,x2,x3,x4,…xn)
X1:下标表示第一个数据
X1:该值表示第一个数据的排列值
2、解空间的组织结构

实验五:搜索法实验(n皇后问题)_搜索法_06

(这是一颗排序树,它的深度为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)八皇后问题

实验五:搜索法实验(n皇后问题)_叉树_07


可以看出八皇后问题一共由92中解法

实验五:搜索法实验(n皇后问题)_时间复杂度_08

(2)四皇后问题

实验五:搜索法实验(n皇后问题)_n皇后_09


可以看出四皇后问题一共由2中解法

实验五:搜索法实验(n皇后问题)_时间复杂度_10

7、结果分析
经分析结果正确,时间复杂度为(n!)

三、对比分析
经分析满n叉树的时间复杂度为n^n,经排列树优化之后为n!,时间复杂度大大降低。

测试真实时间:

(1)使用满二叉树

实验五:搜索法实验(n皇后问题)_时间复杂度_11


实验五:搜索法实验(n皇后问题)_搜索_12


实验五:搜索法实验(n皇后问题)_搜索_13

(2)使用排列树

实验五:搜索法实验(n皇后问题)_搜索法_14


实验五:搜索法实验(n皇后问题)_搜索法_15


实验五:搜索法实验(n皇后问题)_n皇后_16

((152+151+152)-(86+88+91))/(152+151+152)= 41.8%
可以得出使用排列树比满n叉树性能提升了41.8%


举报

相关推荐

0 条评论