- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法分析与设计实验报告
第 6 次实验
姓名刘悦学号201308080112班级物联1301班时间12.12上午地点工训楼C栋309
实验名称
回溯法实验(八皇后问题)实验目的掌握回溯法求解问题的思想。
学会利用其原理求解相关问题。实验原理使用迭代实现回溯法。
从第一行开始放置皇后,第一行从第一列开始放置。
之后放置第二行,与已放置的皇后冲突的位置不再考虑。
之后再放置后面行的皇后,一旦某一行无位置可放,就退回到上一行,选择后面的其他位置进行放置。之后再重复上面的过程。
一旦到达最后一行,就求得了解,记录这个时候的放置的信息。实验步骤
放置第一行的皇后。
放置后面行的皇后,与已放置的皇后在同一直线、横线、斜线的位置不能放置。
放置后面的皇后。一旦某一行无位置可放,就???回到上面一行,选择其他位置放置皇后。
一旦到达最后一行,意味着找到了一个可行解,就记录这个放置方案。
重复过程,直至找到所有可能的放置解。关键代码/*=================================================================
定义Queen类来存储皇后的信息。
=================================================================*/
class Queen
{
friend int nQueen(int);
private:
bool Place(int k);
void Backtrack(void);
int n;//皇后个数
int *x;//当前解
long sum;//当前已找到的可行方案数
};
/*=================================================================
Place函数进行可行性约束。
若当前的位置已经与之前放置的皇后位置冲突,返回false;否则返回true。
若两皇后的斜率为-1或1则表示在同一斜线上就冲突,返回false。
*******************************************************************
k表示当前放置的皇后的行数。
x[k]表示第k行皇后放置的列数。即第k个皇后放在第x[k]列。
=================================================================*/
bool Queen::Place(int k)
{
for(int j=1;jk;j++)
//abs(k-j)==abs(x[j]-x[k])时,两皇后在同一斜线上
if((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k]))
return false;
return true;
}
/*=================================================================
Backtrack函数迭代求皇后放置的位置。
如果已经放完最后一行,就将放置方案数加一,并将各个皇后放置的位置输出到记事本中
否则,就找一个可以放置的位置,然后进行下一行的放置。
这里使用迭代实现,使用k来记录当前的行数
如果某一行无位置可放,将回溯到前面一行,即k-- ,选择其他位置放置皇后。
*******************************************************************
k表示当前放置的皇后的行数。
x[k]表示第k行皇后放置的列数。即第k个皇后放在第x[k]列。
=================================================================*/
void Queen::Backtrack(void)
{
x[1]=0;
int k=1;
while(k0)
{
x[k]+=1;//第k行的放置皇后为第一列
//如果不满足约束条件就继续找后面一列看是否可放皇后
while((x[k]=n)!(Place(k)))
x[k]+=1;
//当前行有位置可放
if(x[k]=n)
//已经放完最后一行的皇后
if(k==n)
{
sum++;//找到的放置方案数+1
//将具体放置方案写到记事本文件【N皇后_迭代.txt】中
static ofstream fout(N皇后_迭代.txt);
fout第sum种方案:endl;
您可能关注的文档
最近下载
- photoshop实验指导书..doc VIP
- 文献阅读与数学写作:微积分的创立与发展++课件-2024-2025学年高二下学期数学人教A版(2019)选择性必修第二册.pptx VIP
- TPM全员生产维护培训课件(课件-36张).ppt VIP
- 《全国食品安全监督抽检实施细则》复习测试卷附答案.doc
- 一种铁电负电容晶体管的电路仿真模型及建模方法.pdf VIP
- 《智慧化税费申报与管理》教案 项目八 资源税和环境保护税智慧化申报与管理.docx VIP
- 建筑法培训课件.ppt VIP
- 铜陵铜化集团招聘考试试题.pdf
- 食品抽检复习试题有答案.doc
- 2025年秋季《南京照相馆》开学第一课主题班会课件.pptx VIP
文档评论(0)