博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[经典算法] 八皇后
阅读量:6907 次
发布时间:2019-06-27

本文共 1713 字,大约阅读时间需要 5 分钟。

题目说明:

西洋棋中的皇后可以直线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八个皇后如何相安无事的放置在棋盘上,1970年

与1971年,E.W.Dijkstra与N.Wirth曾经用这个问题来讲解程式设计之技巧。

 

题目解析:

关于棋盘的问题,都可以用递回求解,然而如何减少递回的次数?在八个皇后的问题中,不必要所有的格子都检查过,例如若某列检查

过,该该列的其它格子就不用再检查了,这个方法称为分支修剪。

 

程序代码:

#include
using namespace std;const int N_SIZE = 8;/// 使用数组记录状态int UpperOblique[2*N_SIZE + 1] = {
0};int LowerOblique[2*N_SIZE + 1] = {
0};int Column[N_SIZE + 1] = {
0};int Queen[N_SIZE + 1] = {
0};int Number = 0;void ShowResult(){ cout << "\nNO " << ++Number << ":" <
N_SIZE) ShowResult(); else { for (int j=1; j<=N_SIZE; ++j) { if (Column[j]==0 && UpperOblique[i-j+N_SIZE]==0 && LowerOblique[i+j]==0) { Queen[i] = j; Column[j] = UpperOblique[i-j+N_SIZE]=LowerOblique[i+j]=1; BlackTrack(i+1); Column[j] = UpperOblique[i-j+N_SIZE]=LowerOblique[i+j]=0; } } }}int main(){ BlackTrack(1); return 0;}

 

#include 
#include
using namespace std;const int N_SIZE = 8;int Record[N_SIZE+1] = {
0}; /// 记录每列选择的位置int ResultNum = 0;bool Check(int x){ for (int i = 1; i
N_SIZE) { ShowResult(); } else { for (int j=1; j <=N_SIZE; ++j) { Record[x] = j; if (Check(x)) { BackTrack(x+1); } } }}int main(){ BackTrack(1); return 0;}

还有诸如 遗传算法、退火算法、位运算和基于Q一矩阵的快速搜索算法。但是这些算法中,遗传算法和基于Q一矩阵的快速搜索算法一般只能得到部分解;退火算法得到的解往往是近似解,存在一定的误差:位运算依赖硬件,32位机器只能计算32皇后,如果要计算任意皇后,需要增加变量,会带来额外的系统开销和编程难度。

转载于:https://www.cnblogs.com/Quincy/p/4710520.html

你可能感兴趣的文章
使用 connect-domain 捕获异步调用中出现的异常
查看>>
HTTP协议头部与Keep-Alive模式详解
查看>>
windows XP下MySQL Cluster集群安装配置 .
查看>>
CentOS6 图形界面'Basic server'条件下的(gnome)安装 .
查看>>
hdu 1254 推箱子游戏
查看>>
ssis 配置 sqlserver 作业
查看>>
Programming Clojure - Unifying Data with Sequences
查看>>
SwingX 1.6.5 发布,GUI 工具包
查看>>
How to use BTM as the transaction manager in Tomcat 6.x
查看>>
C# 模拟 Post
查看>>
【mat】learn matlab
查看>>
每天将MYSQL SLOW QUERY REPORT分发到各个邮箱供分析改善数据库性能-PYTHON
查看>>
Lazy Load, 延迟加载图片的 jQuery 插件
查看>>
Oracle宣布终止所有Intel Itanium平台上的软件开发
查看>>
SQL注入
查看>>
RMAN 增量备份 的 对象测试
查看>>
学习、证书-iOS开发心路历程-by小雨
查看>>
[WorldWind学习]10.插件结构
查看>>
拦截器权限控制使用Struts 拦截namespace进行权限控制-java教程
查看>>
判断数据集matlab 实现基本apriori算法
查看>>