题目

N皇后回溯法求解空间

目的要求

目的:
1.用学到的书本知识解决实际问题的能力;
2.锻炼实际工作所需要的动手能力;
3.加强对数据结构和算法的应用;
4.锻炼自己以科学理论和工程上能力的技术,规范地开发大型、复杂、高质量的应用软件和系统软件具有关键性作用;
5.通过课程设计的实践,我们可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练;
6.通过课程设计提高编写技术文档的能力;

要求:
1.针对具体问题,完成从分析问题、设计算法、分析算法、实现算法的全部过程。
2.对N皇后问题进行问题分析
3.选择合适的算法策略,对N皇后问题进行算法设计
4.使用算法对N皇后进行编码实现
5.测试用例设计、测试与运行记录
6.编写设计文档以及对课程设计总结

主要内容及技术要求

3.1 主要内容

  1. 利用《算法设计与分析》课程中所学到的编程知识和编程技巧对N皇后进行问题分析,选择合适的算法策略解决问题
  2. 对N皇后问题进行算法设计并且分析
  3. 使用算法对N皇后进行编码实现
  4. 测试用例设计、测试与运行记录
    3.2 实现功能
    使用回溯的思想对所有的可行性路径进行验证,收集所有可行性解,解决N皇后问题.

主要参考资料

1.趣学算法,作者: 陈小玉,出版社: 人民邮电出版社,出版年: 2017-7-1

2.算法导论(原书第2版),作者:[美] Thomas H.Cormen / Charles E.Leiserson / Ronald L.Rivest / Clifford Stein ,机械工业出版社,原作名: Introduction to Algorithms,译者: 潘金贵 等 ,出版年: 2006-9

3.数据结构与算法分析,作者: [美] Mark Allen Weiss ,出版社: 机械工业出版社,译者: 冯舜玺 ,出版年: 2004-1-1,原作名: Data Structures and Algorithm Analysis in C:Second Edition,

4.啊哈!算法,作者: 啊哈磊 ,出版社: 人民邮电出版社,出版年: 2014-6-1


一 概述

背景:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

1.2 题目描述:
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q…", // 解法 1
“…Q”,
“Q…”,
“…Q.”],

["…Q.", // 解法 2
“Q…”,
“…Q”,
“.Q…”]
]
解释: 4 皇后问题存在两个不同的解法。

二 问题分析

2.1 解空间:
根据图可知,这是一个nn的棋盘范围,而总需要部署n个皇后.每个棋盘位置有两种基础可能.已经知道一行内有n种部署,总共有n行,可知初始状态下可以部署nn种解空间范围.
本题中描述的问题解有且大于1个,并且不大于n*n个
2.2 解空间结构:
分析整个题目过程,当每下一步的时候,根据其同行不能下其他皇后的要求,可知每行有1个解,根据其同列不能下其他皇后的要求,可知每列有1个解,根据斜方向不能下其他皇后的要求,可知斜行只有一个解.每走一步,下一步的皇后可走范围就会少一点,当第N个皇后在第N列占棋盘位置后即到达棋盘深度N时并且成功部署即为一个解.
2.3 剪枝:
剪纸是对一些不必要路径放弃检索,可以减少检索过程,提高效率,在N皇后问题中,当第x行(小于n行)的皇后没有位置可以占用的时候无需对x以后的皇后进行检索了,缩短了检索路径,适当剪纸提高效率.

三 算法设计

这道题需要用到回溯算法,现在在这里先简单的介绍一下这个算法:
回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

3.1 回溯算法的基本思想:
从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为:
1、定义一个解空间,它包含问题的解。
2、利用适于搜索的方法组织解空间。
3、利用深度优先法搜索解空间。
4、利用限界函数避免移动到不可能产生解的子空间。
问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。

3.2 N皇后回溯算法思路:
3.2.1 创建一个全局数组存储每一行的Q位置:
因为题目要求不能在同一行,所以一行只能有一个Q,所以可以创建一个n大小的int数组存储每一行Q的位置,采用回溯的方法,每一行的位置都进行判断,直到排完n的位置或者第i行无法排下任何一个位置。

3.2.2 创建一个局部数组存储第i行哪些位置可以可以存放Q:
因为同一行,同一列,同一斜线的位置不能存放Q,所以创建一个局部数组,根据前i-1行内Q的位置,判断出第i行哪些位置可以存放Q,初始化为0:可以存放,值为1:不能存放,实现剪枝,缩小深搜范围。

当搜索完全部后,将所得解加入到全局list:
创建一个List<List> list存放一个解,List为一个解中的其中一行,如:…Q…
3.2.3 设置边界条件:
当搜索完n后,将搜索得出的解加入到全局list中

四 算法分析:

4.1 时间复杂度:
该算法在最好的情况下,N皇后求得第一个解需要试探n次,获取到一个解后需要nn次绘制满足条件的N皇后位置图.
方法递归n行, 每次循环 n 列, 比较 0~n-1 次。当满足边界条件的时候需要n
n次来绘制满足条件的N皇后位置图
n * n * (n - 1) +nn.
也就是 O(n^3)
4.2 空间复杂度
全局数组长度为n,方法递归n行, 每次创建长度为n的局部数组n+n
n
也就是O(n^2)

五 编码实现

import java.util.ArrayList;
import java.util.List;
public class Main {public static void get(List<List<String>> list,int[] num,int n,int a){if(a==n){List<String> stringList = new ArrayList<String>(n);StringBuffer s= new StringBuffer();for(int i=0;i<n;i++){s.setLength(0);for(int j=0;j<n;j++){s.append(".");}s.replace(num[i],num[i]+1,"Q");stringList.add(s.toString());}list.add(stringList);return;}int[] newNum = new int[n];for(int i=0;i<a;i++){newNum[num[i]]=1;if((num[i]-(a-i))>=0){newNum[num[i]-(a-i)]=1;}if((num[i]+(a-i))<n){newNum[num[i]+(a-i)]=1;}}for(int i=0;i<newNum.length;i++){if(newNum[i]==0){num[a]=i;get(list,num,n,a+1);}}}public static List<List<String>> solveNQueens(int n) {int[] num = new int[n];for(int i=0;i<num.length;i++){num[i]=-1;}List<List<String>> list = new ArrayList<List<String>>();get(list,num,n,0);return list;}public static void main(String[] args) {List<List<String>> lists = solveNQueens(6);for(List<String> one :lists){for(String two :one){System.out.println(two);}System.out.println("");}}
}

六 测试用例设计、测试与运行记录

6.1 模拟测试数据:

如3,运行结果:
无解

如6,运行结果:
.Q…
…Q…
…Q
Q…
…Q…
…Q.

…Q…
…Q
.Q…
…Q.
Q…
…Q…

…Q…
Q…
…Q.
.Q…
…Q
…Q…

…Q.
…Q…
Q…
…Q
…Q…
.Q.…

七 总结:

回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。 我们还可以通过剪枝来删去不必要的搜索.
这次算法题目的N皇后问题是一道典型的回溯法问题,通过这次算法课程设计,我对回溯法的理论知识转换为实际应用,对回溯的思想有了进一步的思考与了解.不过这题中的问题也是显而易见,因为使用的的是递归方法,当N的值过大时就会爆内存不足的问题,分析得是回溯法是一种枚举方法,当数据量过大时容易爆内存,所以需要选择适当的剪枝.在算法的设计与分析中,我也根据时间复杂度和空间复杂度对程序的性能进行了一定的评估,通过预测可以了解自己的程序是否已经最优.最后还通过测试用例验证我的算法正确性.通过这次项目,针对具体的N皇后问题应用了回溯法以及算法设计与分析,对解决问题的能力有了进一步的提高.

在此感谢帮助过我的同学和指导老师,谢谢!

算法设计与分析 课程设计之N皇后问题相关推荐

  1. 算法设计和分析课程设计报告

    文章目录 1. 题目 2. 目的 3. 内容 4. 需求分析 5. 逻辑结构设计 6.算法详细设计 7.编码与调试 8. 算法改进,优化方法 10.总结,心得体会 课程设计报告要求 1. 题目 01背 ...

  2. 算法设计与分析课程的时间空间复杂度

    算法设计与分析课程的时间空间复杂度: 总结 算法 时间复杂度 空间复杂度 说明 Hanoi $ O(2^n) $ $ O(n) $ 递归使用 会场安排问题 \(O(nlogn)\) \(O(n)\) ...

  3. 算法设计与分析课程复习笔记11——单源最短路径

    算法设计与分析课程复习笔记11--单源最短路径 单源最短路径 最短路径问题 输入:有权有向图G=(V,E) 路径p={ v 0 , v 1 , . . . , v k v_0, v_1, . . . ...

  4. 计算机算法课程论文设计与实现,算法设计与分析课程论文

    算法设计与分析课程论文 "卓越工程师教育培养计划"(简称卓越计划)旨在培养一批创新能力强.适应经济社会发展需要的高质量工程技术人才.在南通大学计算机科学与技术学院制定的软件工程专业 ...

  5. 潮流分析matlab课程设计小结,电力系统暂态分析课程设计--基于MATLAB的电力系统复杂潮流分析...

    电力系统暂态分析课程设计--基于MATLAB的电力系统复杂潮流分析 电力系统稳态分析课程设计 题 目基于 MATLAB 的电力系 统 复杂潮流分析 学生姓名 学 号 专 业电气工程及其自动化 班 级 ...

  6. 一维信号 处理分析 c语言,信号处理与分析课程设计训练任务书.doc

    信号处理与分析课程设计训练任务书 电子工程学科部 2015年4月 第一部分:语音信号部分 题目一:基于归一化互相关函数的基音检测 (负责人:贾懋珅) 本课题是根据电子信息类本科生信号处理和分析课程的学 ...

  7. matlab多径信道模型,多径时变信道模型的仿真与性能分析课程设计(样例3)

    <多径时变信道模型的仿真与性能分析课程设计.doc>由会员分享,可免费在线阅读全文,更多与<多径时变信道模型的仿真与性能分析课程设计>相关文档资源请在帮帮文库(www.woc8 ...

  8. 停车场计费算法 php,《算法与数据结构》课程设计之停车场的收费管理系统

    <算法与数据结构>课程设计 题目:停车场的收费管理系统 一. 设计目的与内容 1. 问题描述 任务:停车场可以同时停放M辆车,停车场的入口和出口可分别有N辆车排队.停车每小时收费5元,每天 ...

  9. 计算器java程序设计报告总体设计_计算器设计的java课程设计报告.doc

    计算器设计的java课程设计报告.doc 华东交通大学课程设计1华东交通大学课程设计课程:Java程序设计题目:计算器设计年级:2010级专业:信息一班学号:姓名:组员:指导教师:课程设计题目:计算器 ...

最新文章

  1. 荣获计算机视觉“奥斯卡”奖提名的年轻人!康奈尔大四学生林之秋的科研之道...
  2. java cglib jar包_Java面试题|反射必看的4道面试题
  3. 简单选择排序验证性实验
  4. Hazelcast更换CEO,承诺继续造福开源社区
  5. 【外传】前端开发——elementUI使用方法
  6. 《重构-改善既有代码的设计》学习笔记----Extract Method(提炼函数)
  7. 【转载】如何在Ubuntu上安装LAMP服务器系统?
  8. dbml mysql_深度好文:全方位了解MLDB数据库
  9. CTD数据库(Comparative Toxicogenomics Database)介绍与使用
  10. 国际国内cms系统开源网址大综合
  11. python 动物园_python面向对象 动物园 例题
  12. HTML <caption> 标签
  13. mybatis笔记-8、动态sql
  14. 付款码支付-微信和支付宝付款码类型标识
  15. 哦, 这该死的txt回车符~
  16. Win11安装虚拟机出现电脑蓝屏解决方案
  17. linux单机游戏存放目录,Linux安装RocketMQ单机版教程
  18. Set集合下的奇葩,TreeSet有序而且类型相同
  19. 面试陈述切忌千篇一律
  20. 瑞萨MCU单片机资料R5F100LEA RL78G13视频例程软件

热门文章

  1. (完美)华为麦芒7 SNE-AL00的usb调试模式在哪里开启的流程
  2. linux中 改文件后缀名,linux 下批量更改文件后缀
  3. AI英雄 | 专访vivo周围:手机行业的下一站是AI与IoT
  4. 【Algorithms】Manacher 马拉车
  5. 数据分析师统计学必知必会!
  6. 哈工大刘宏伟计组(1)
  7. bat拷贝与powershell拷贝
  8. uniapp项目前端埋点实现方案
  9. pythonxpath定位_selenium+python自动化-xpath定位语法
  10. 面经|快手|策略运营实习生(数据分析)-【电商】|30min