n皇后
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验[4]
[实验题目]:n皇后
专业:信息与计算数学学号:姓名:日期:
1.实验目的
学习递归算法的算法思想,并将其运用在计算机程序中。
2 实验内容
首先学习递归算法的思想
然后运用递归算法的思想进行程序编译
3.算法设计
要解决N皇后问题,其实就是要解决好怎么放置这n个皇后,每一个皇后与前面的所有皇后不能在同一行、同一列、同一对角线,在这里我们可以以行优先,就是说皇后的行号按顺序递增,只考虑第i个皇后放置在第i行的哪一列,所以在放置第i个皇后的时候,可以从第1列判断起,如果可以放置在第1个位置,则跳到下一行放置下一个皇后。
如果不能,则跳到下一列...直到最后一列,如果最后一列也不能放置,则说明此时放置方法出错,则回到上一个皇后向之前放置的下一列重新放置。
此即是回溯法的精髓所在。
当第n个皇后放置成功后,即得到一个可行解,此时再回到上一个皇后重新放置寻找下一个可行解...如此后,即可找出一个n皇后问题的所有可行解。
4.程序代码
#include <iostream>
using namespace std;
int p[12][12];//初始化矩阵(矩阵太大回溯法的效率很低,所以该题的数据很小)
int result;
int n;//矩阵大小
void init(int n)//初始化矩阵
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
p[i][j]=0;
}
result=0;
}
bool issafe(int row,int col)//判断该位置能否放皇后
{
for(int i=0;i<row;i++)
{
for(int j=0;j<n;j++)
{
if(p[i][j]==1)
{
//判断同行,同列,对角线上是否有皇后
if(i==row||j==col||(j-i)==(col-row)||(j+i)==(col+row))
return false;
}
}
}
return true;
}
void putqueen(int x)//入皇后
{
for(int y=0;y<n;y++)//遍历该行每个位置
{
if(issafe(x,y))//如果可以
{
p[x][y]=1;//则放皇后
if(x<n-1)
putqueen(x+1);//如果未到最后一行,在下一行放皇后else
result++;//否则返回,结果加1
}
{
for(int k=0;k<n;k++)//该步骤很重要,拿走该行上的皇后
p[x][k]=0;
}
}
}
int main()
{
cout<<"请输入皇后数:"<<endl;
while(cin>>n)
{
init(n);
putqueen(0);
cout<<n<<"皇后有"<<result<<"解"<<endl;
}
return 0;
}
5 运行结果
6 结果分析
由于100皇后的解太庞大计算机无法快速的计算出答案,故选择了8皇后进行计算,其结果与其他同学程序的结果进行对后数值大小上一致。