实验五:搜索法实验(n皇后问题)
Posted Roninaxious
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验五:搜索法实验(n皇后问题)相关的知识,希望对你有一定的参考价值。
一、满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%
以上是关于实验五:搜索法实验(n皇后问题)的主要内容,如果未能解决你的问题,请参考以下文章