- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
试验二n后问题的回溯算法试验目的掌握n后问题的回溯递归
实验二 n后问题的回溯算法
一、实验目的:
掌握n后问题的回溯递归算法。
理解并掌握分析回溯算法效率的方法。
使用Estimate算法就8皇后问题给出效率估算。
二、模型建立:
问题:
(1) 编写求n后问题的通用函数;
(2) 取n=8计算出n后问题的所有可行解,并以8元组的形式输出;(对可行解的结构进行分析)
要求:
(1) 随机输出2个可行解的图形。其中棋盘要有8×8的格子,Queen图像自选;
(2) 使用Estimate算法随机取n=5-10条随机路径估算回溯法的效率并加以分析;
求解思路:
(1)、对第一问求解。
n后问题要求在一个n*n格的棋盘上放置n个皇后,使得他们彼此不受攻击。即要求任何两个皇后不能放在同一行或同一列或同一斜线上。
对此,我们用一个n元组表示其解。x[i]表示皇后i放在棋盘的第i行的第x[i]列。根据要求,可以得出两个约束条件:(i) 任何两个皇后不能在同一列,即:对任意i≠j,x[i]≠x[j]。(ii) 任何两个皇后不可以在同一斜线上,即对任意i≠j,有| i-j |≠| x[j]-x[i] |。
用回溯法解n后问题时,可以用一棵完全n叉树来表示其解空间。可以用可行性约束函数Place (即上述两个约束条件)剪去不满足行、列和斜线约束的子树。
(2)、对第二问的求解。
利用第一问,可以求得n=8的所有可行解。在本程序中直接输出。由于可行解的结构具有旋转性和对称性。故,8后问题共计92组解可有几组基本解通过旋转或对称得到。
三、模型求解
1、开发环境
开发工具: Microsoft Visual Studio 6.0
Windows 2003下编译运行
2、程序设计说明
本次实验为“N皇后问题”,用纯C语言编写,用于解决N皇后问题,所有解以n元组的形式在屏幕输出。根据要求,本程序中定义n为8,得到一共92组解。
3、源代码
#include stdio.h
#define MAXN 20
int n,m,good;
int col[MAXN+1],a[MAXN+1],b[2*MAXN+1],c[2*MAXN+1];
int main()
{
int j;
char awn;
printf(Enter n: );
scanf(%d,n);
for(j=0; j=n; j++)
a[j]=1;
for(j=0; j=2*n; j++)
b[j]=c[j]=1;
m=1;
col[1]=1;
good=1;
col[0]=1;
do{
if(good)
if(m==n)
{
// 找到一个解
printf(列\t行\n);
for(j=1; j=n; j++)
printf(%3d\t%d\n,j,col[j]);
printf(Enter a character (Q/q for exit)!\n );
scanf(%c,awn);
if(awn==Q||awn==q)
return 0;//exit(0);//
while(col[m]==n)
{
m--;
a[col[m]]=b[m+col[m]]=c[n+m-col[m]]=1;
}
col[m]++;
}
else
{
a[col[m]]=b[m+col[m]]=c[n+m-col[m]]=0;
col[++m]=1;
}
else
{
while(col[m]==n)
{
m--;
a[col[m]]=b[m+col[m]]=c[n+m-col[m]]=1;
}
col[m]++;
}
good = a[col[m]]b[m+col[m]]c[n+m-col[m]];
}while(m!=0);
}4、程序使用说明
本程序具体解决n皇后问题。其值已在程序开头用define定义MAXN为20。故皇后总数不能大于20。可以从屏幕直接查看解。解的模式按皇后的所在的队列给出。观察下一组解,可按“ENTER”按钮。
5、模型的解
/*-------------八皇后问题-8元组形式(此处用“|”表示实际在屏幕显示时是换行) -------------*/
这是8皇后问题的所有解
1 5 8 6 3 7 2 4 | 1 6 8 3 7 4 2 5 | 1 7 4 6 8 2 5 3 | 1 7 5 8 2 4 6 3 | 2 4 6 8 3 1 7 5
2 5 7 1 3 8 6 4 | 2 5 7 4 1 8 6 3 | 2 6 1 7 4 8 3 5 |
原创力文档


文档评论(0)