国际象棋“皇后”问题的回溯算法
//国际象棋“皇后”问题的回溯算法/**//* 作者:成晓旭
时间:2001年10月9日(17:35:38-18:00:00)
内容:完成“皇后”问题的程序序言部分
时间:2001年10月9日(14:00:00-15:00:00)
内容:完成“皇后”问题的程序序言部分
===================================================
问题描述:
在一个n*n的棋盘上放置n个不能互相捕捉的国际象棋“皇后”,
并输出所有合理的布局情况.(在国际象棋中,皇后可以沿着纵、横
及两条斜线共4个方向捕捉对手,可见,合适的解是在每行、每列及
在一条斜线上只能有一个皇后<皇后相互捕捉>)
编程思想:
算法描述:
{
输入棋盘大小值n;
m=0; //从空配置开始
notcatch=1; //空配置中皇后不能相互捕捉
do
{
if(notcatch)
{
if(m==n)
{
输出解;
调整(形成下一个候选解);
}
else
扩展当前候选解至下一列; //向前试探
}
else
调整(形成下一个候选解); //向后回溯
notcatch = 检查当前候选解的合理性
}while(m!=0)
}
*/#include"stdlib.h"#defineMAXN 100//全局变量及全局工作数组定义intm,n,NotCatch;
intColFlag[MAXN+1];/**//*表示第i列的第ColFlag[i]行有皇后,(1:有;0:没有)*/intRowFlag[MAXN+1];/**//*RowFlag[i]:表示第i行没有皇后(1:没有;0:有)*/intupBiasFlag[2*MAXN+1];/**//*upBiasFlag[i]:表示第i条上斜线(右高左斜)没有皇后(1:没有;0:有)*/intdnBiasFlag[2*MAXN+1];/**//*dnBiasFlag[i]:表示第i条下斜线(左高右斜)没有皇后(1:没有;0:有)*///显示输入填写的数字voidArrangeQueen()
...{
inti;
charanswer;
printf("输入棋盘边格数:");
scanf("%d",&n);
for(i=0;i<=n;i++)/**//*设置程序初始状态*/ ColFlag[i]=1;
for(i=0;i<=2*n;i++)
upBiasFlag[i]=dnBiasFlag[i]=1;
m=1;
ColFlag[1]=1;
NotCatch=1;
ColFlag[0]=0;
do...{
if(NotCatch)
...{
if(m==n)
...{
printf("列 行");
for(i=1;i<=n;i++)/**//*找到可行解,输出*/ printf("%3d %3d ",i,ColFlag[i]);
printf("还要继续搜索吗(Q/q for Exit)? ");
scanf("%c",&answer);
if(answer=='Q'||answer=='q')
exit(0);
while(ColFlag[m]==n)
...{
m--;/**//*清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的标志*/ RowFlag[ColFlag[m]]=upBiasFlag[m+ColFlag[m]]=dnBiasFlag[n+m-ColFlag[m]]=1;
} ColFlag[m]++;/**//*调整第m列的皇后配置(扩展调整)*/ }else...{
/**//*设置第m列,第RowFlag[ColFlag[m-1]]行有皇后的标志*/ RowFlag[ColFlag[m]]=upBiasFlag[m+ColFlag[m]]=dnBiasFlag[n+m-ColFlag[m]]=0;
ColFlag[++m]=1;/**//*向前试探*/ } }else...{
while(ColFlag[m]==n)/**//*向后回溯*/...{
m--;/**//*清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的标志*/ RowFlag[ColFlag[m]]=upBiasFlag[m+ColFlag[m]]=dnBiasFlag[n+m-ColFlag[m]]=1;
} ColFlag[m]++;/**//*调整第m列的皇后配置(回溯调整)*/ } NotCatch=RowFlag[ColFlag[m]]&&upBiasFlag[m+ColFlag[m]]&&dnBiasFlag[n+m-ColFlag[m]];
}while(m!=0);
}
voiddArrange_Queen_All(intk,intn)
...{
inti,j;
charanswer;
for(i=1;i<=n;i++)
...{
if(RowFlag[i]&&upBiasFlag[k+i]&&dnBiasFlag[n+k-i])
...{
ColFlag[k]=i;
RowFlag[i]=upBiasFlag[k+i]=dnBiasFlag[n+k-i]=0;
if(k==0)
...{
printf("列 行");
for(j=1;j<=n;j++)/**//*找到可行解,输出*/ printf("%3d %3d ",i,ColFlag[i]);
printf("还要继续搜索吗(Q/q for Exit)? ");
scanf("%c",&answer);
if(answer=='Q'||answer=='q')
exit(0);
}else dArrange_Queen_All(k+1,n);
RowFlag[i]=upBiasFlag[k+i]=dnBiasFlag[n+k-i]=1;
} }}voiddArrangeQueenAll()
...{
inti;
printf("输入棋盘边格数:");
scanf("%d",&n);
for(i=0;i<=n;i++)/**//*设置程序初始状态*/ ColFlag[i]=1;
for(i=0;i<=2*n;i++)
upBiasFlag[i]=dnBiasFlag[i]=1;
dArrange_Queen_All(1,n);
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=935666
国际象棋“皇后”问题的回溯算法相关推荐
- 八皇后时间复杂度_回溯算法 | 追忆那些年曾难倒我们的八皇后问题
文章收录在公众号:bigsai,关注更多干货和学习资源 记得点赞.在看 前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 在这里 ...
- 算法:递归-八皇后问题(回溯算法)
1.问题介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯・贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不 ...
- 递归-八皇后问题(回溯算法)
一:八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个 ...
- n皇后的拉斯维加斯回溯算法
<1>.拉斯维加斯概念: 拉斯维加斯算法不会得到不正确的解.一旦用拉斯维加斯算法找到一个解,这个解就一定是正确解.但有时用拉斯维加斯算法会找不到解.拉斯维加斯算法找到正确解的概率随着它所用 ...
- 回溯 皇后 算法笔记_回溯算法:N皇后问题
给「代码随想录」一个星标吧! ❝ 通知:我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便 ...
- 回溯算法 | 追忆那些年曾难倒我们的八皇后问题
文章收录在公众号:bigsai 更多精彩干货敬请关注! 前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 第一次遇到它的时候应该 ...
- 回溯算法(八皇后问题)
写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...
- 多字段回溯 mysql_回溯算法 | 追忆那些年曾难倒我们的八皇后问题
前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 在这里插入图片描述 第一次遇到它的时候应该是大一下或者大二这个期间,这个时间对 ...
- 回溯算法(以解决n皇后问题为例)
基本思想: 回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试.八皇后问题就是回溯算法的典型,第一步按照顺序放一个皇后,然后第二步符合要求放第2个皇后,如果没有位置符合要求, ...
最新文章
- 程序员的“凡尔赛文学”大赏!
- Xamarin Essentials教程数据传输DataTransfer
- 高效的沟通方式-会议
- E - 秋实大哥与战争
- 哪里的草莓质量又好又便宜呢?水果批发市场(前提你买的得多)
- 干货 | 应用性能提升 70%,探究 mPaaS 全链路压测的实现原理和实施路径
- PKU 学生反馈 2009 - 4
- 计算机二级考试模拟表单答题,2016年计算机二级考试《VFP》模拟简答试题
- php 查看扩展 代码,[扩展推荐] 使用 PHP Insights 在终端查看 PHP 项目代码质量
- RHEL6.3 NFS服务搭建过程详解
- linux计算机网络一般需要配置哪几部分,计算机网络技术 知识及应用第4章Linux操作系统和常用服务器配置.ppt...
- Atitit 持久化 Persistence概念的艺术 目录 1. 持久化是将程序数据在持久状态和瞬时状态间转换的机制。	1 2. DBC就是一种持久化机制。文件IO也是一种持久化机制。	2 3.
- 英尺英寸和厘米的换算_英尺米换算(英尺英寸与厘米换算器)
- 腾讯掀起史上最大一轮管理干部裁撤:从月入2万+到领4千工资的中年们
- 多波段 “均值标准距”的计算
- 远程桌面 - linux
- 最强文件搜索神器——Everything
- 针对python代码下载youtub视屏报错修复
- 编程java好学吗,编程好学吗?零基础学多久能入门?
- java闭锁_Java闭锁—CountDownLatch
热门文章
- Python零基础爬虫之回车桌面壁纸并实现自动换壁纸(内附完整源码)
- 从“看得清”到“看得懂”:视域提升带来的管理“魔法”
- photoshop输出html网页方法
- Xamarin.forms之Image加载服务器图片、WebView
- 单片机仿真器的原理介绍
- Pyth笔记-高级装饰器
- iOS 用UIPanGestureRecognizer实现单手指点击拖动缩放
- 服务器充电桩是什么显示,服务区有充电桩吗,汽车充电桩介绍
- 根据id选择器隐藏 标签
- Internet of things 译文