n皇后实验报告.docx
《n皇后实验报告.docx》由会员分享,可在线阅读,更多相关《n皇后实验报告.docx(7页珍藏版)》请在冰豆网上搜索。
n皇后实验报告
n皇后实验报告
实验报告
实验名称n皇后问题
课程名称计算机算法设计与分析
专业班级:
学生姓名:
学号:
成绩:
指导老师:
实验日期:
a)x[i]≠x[j],i≠j:
不允许将任何两个皇后放在同一列上;
b)|j-i|≠|x[j]-x[i]|:
不允许两个皇后位于同一条斜线上。
问题的解空间的形式为:
要找出”四皇后”问题的解,最可靠的方法就是把各种情况全部检核一遍,将符合条件A的解找出来。
但这样做,你要有相当耐心才行,这是很费时的。
采用回溯算法进行求解,在搜索的过程中,将不满足条件要求的分支树减去,可以有效的降低算法的时间复杂性。
n后问题的算法描述如下:
剪枝函数:
boolOk(intt)
{
inti;
for(inti=0;iif(x[t]==x[i]||abs(t-i)==abs(x[t]-x[i]))
return0;
}
return1;
}
voidBacktrack(intt)
{
if(t>=n){
cout<<"第"<\n";
for(inti=1;i<=n;i++){
for(intj=1;j<=n;j++){
if(j==x[i])
cout<<"1";
else
cout<<"0";
}
cout<}
sum++;
}
else{
for(inti=0;ix[t]=i;
if(Ok(t))
Backtrack(t+1);
}
}
}
一、实验结果
五、实验代码
#include
usingnamespacestd;
int*x;//当前解
intn;//皇后的个数N
intsum=1;
boolOk(intt)//检查参数所指示的这一行皇后放置方案是否满足要求
{
inti;
for(inti=0;iif(x[t]==x[i]||abs(t-i)==abs(x[t]-x[i]))
return0;
}
return1;
}
voidBacktrack(intt)
{
if(t>=n){
cout<<"第"<\n";
for(inti=1;i<=n;i++){
for(intj=1;j<=n;j++){
if(j==x[i])
cout<<"1";
else
cout<<"0";
}
cout<}
sum++;
}
else{
for(inti=0;ix[t]=i;
if(Ok(t))
Backtrack(t+1);
}
}
}
voidmain()
{
cout<<"输入皇后个数:
";
cin>>n;
x=(int*)malloc(sizeof(int)*n);
Backtrack(0);
cout<<"一共的方案数为:
"<system("pause");
}
六、实验心得
通过本次实验的学习,让我了解到了用回溯法可以搜索问题的所有解。
它是一个既带有系统性又带有跳跃性的搜索算法,是按照深度优先策略,从根节点出发搜索解空间树。
算法搜索至某一节点时,利用判断函数先判断该节点内是否包含问题的解,如果不包含则直接跳过,节省时间。
相关的判断函数要根据实际问题来编写,此比较适合求解组合数较大的问题。
总的来说,这次实验不仅让我基本掌握递归的思想,而且进一步提高了自己的自学能力和编程能力,使我对算法的分析与设计有更深刻的认识。
程序不是一时之事,需要长时间的积累,逐步付诸实践才能真正的掌握,我会继续努力学习,争取做得更好。