当前位置:文档之家› 回溯算法实验报告

回溯算法实验报告

for(j=1;j<cur;j++)
if(c[cur]==c[j]||cur-c[cur]==j-c[j]||cur+c[cur]==j+c[j])//同列、同正对角线、同负对角线
{
ok=0;
break;
}/这个for循环检测是否与前cur-1行的皇后有冲突
四、算法实现
具体代码:
#include <iostream>
n皇后问题的回溯算法实验
■必修 □选修
□演示性实验 □验证性实验■操作性实验 □综合性实验
实验地点
W202
实验仪器台号
指导教师
赵晓平
实验日期及节次
2012-2-20
一、问题描述
n后问题是指在一个n*n的棋盘上放置n个皇后,使得它们彼此不受攻击。而一个皇后可以攻击与它处在同一行或同一列或同一斜线上的任何棋子。故n后问题可以理解为:在一个n*n的棋盘内放置n个皇后,使任意两个皇后不处在同一行或同一列或同一斜线上。
我用递归来做这问题。要求皇后所在的位置必须和其他皇后的位置不在同一行、列和斜线上,所以这个限定条件可以用来判断一个皇后是否能放在当前位置。既然是用递归来解决问题那就要把这个问题分成一个个相同的小问题来实现。
这小问题是什么呢?不难发现我们要在n*n的方格里放好n个皇后那我们就要知道在n(列)*n-1(行)是怎么放的,再有我们事先写好的判断条件放好最后行就搞定了。以此类推我们要知道8*7的怎么方的我们就要知道8*6是怎么样的就好了。所以我们是以一行怎么放作为一个单元,每一行有n个位置可以放,每一个位置我们都要去判断一下所以我们就用循环来搞定。在这个循环里面我们让c[cur]=i也就是从这一行的第一个开始判断。先尝试放再去判断是否符合条件。如果符合条件我们就在调用这个函数本身向下一行搜索
outfile<<"第"<<++count<<"个解为:"<<endl;
for(int i=1;i<=n;i++)//在文件中输出结果:o表示皇后在,x表示皇后不在
{
for(int j=1;j<=n;j++)
{
if(c[i]==j)
outfile<<"o";
else
outfile<<"x";
}
outfile<<endl;
在进行判断下一行之前我们要判断一下cur是不是大于n也就是已经是最后一行了,如果是最后一行了我们就可以将其进行输出。打印n*n的矩阵皇后的位置用o表示出来没有的用x表示。
三、算法描述
分析:每个皇后在一行。做个n重循环,把每个皇后安排在每行的每个位置都试一遍。
1、棋盘是n*n数组,定义n+1个空棋盘。
}
五、程序测试及分析
结果输出:
六、总结
回溯法是一种最一般的算法设计方法,特别适用于求解那些涉及到寻求一组解的问题或者求满足某些约束条件的最优解的问题。我解决n皇后问题用的算法正是基于回溯算法的思想提出的一种递归算法,并且找出了八皇后问题的92个真正不同的解,此算法具有结构清晰,容易理解且可读性强等优点,并且通过稍加变通也可以适用于其他类似问题,例如汉诺塔等。与非递归算法设计相比,它往往更容易一些,但是会耗费更多的时间和空间,执行效率不高。
}
}
void main()
{
c=new int[n+1];
ofstream outfile;
outfile.open("output.txt",ios::app);//创建output文件
outfile<<n<<"皇后问题"<<endl;
search(1);//由第一行开始搜索
outfile.close();
#include<fstream>
using namespace std;
#define n 8 //控制皇后个数
int *c; //指向n*n的数组指针
void search(int cur)
{
void show();
int i,j;
if(cur==n+1)
show();//只要走到这,就一定可以有一组解并将它们输出
{
ok=0;
break;
}
if(ok)
search(cur+1);//不冲突,继续搜索
}
}
void show()
{
ofstream outfile;
outfile.open("output.txt",ios::app);//打开output文件
staticint count=0;//静态变量计算解的个数
else
for(i=1;i<=n;i++)//按列搜索
{
bool ok=1;
c[cur]=i; //尝试将第cur行的皇后放入第i列
for(j=1;j<cur;j++)//检测是否与前cur-1行的皇后有冲突
if(c[cur]==c[j]||cur-c[cur]==j-c[j]||cur+c[cur]==j+c[j])//同列、同正对角线、同负对角线
2、第一个皇后从1行1列到1行n列循环。
3、第二个皇后从2行1列到2行8列循环。
用c[cur]==c[j]||cur-c[cur]==j-c[j]||cur+c[cur]==j+c[j]来判断是否与前面放置的皇后冲突若本点不符合,则此点能放棋子,继续搜索。否则退出循环
4、以此类推
在算法中#define n 8控制皇后个数int *c;指向n*n的数组指针search函数是搜索下一行中哪列符合条件
本科学生综合性实验报告
姓名刘春云刘春云学号0103918___
专业软件工程班级_软件103班__
实验项目名称_n皇后问题的回溯算法实验
指导教师及职称_赵晓平__教授__
开课学期2011至_2012学年_三_学期
上课时间2012年2月20日
学生实验报告03918
同组人:无
实验项目
在这个问题中,我用了一个n*n的数组来存储棋盘,由于n后问题的典型是8皇后问题,所以我做的是8皇后问题。得出的解以以下形式出现在文件中:
8皇后问题
第1个解为:
oxxxxxxx
xxxxoxxx
xxxxxxxo
xxxxxoxx
xxoxxxxx
xxxxxxox
xoxxxxxx
xxxoxxxx
二、解题思路
根据条件可以知道皇后肯定是每行都有且只有一个所以我们创建一个数组c[cur]让数组角标表示八皇后的行,用这个角标对应的数组值来确定这个皇后在这行的那一列。
相关主题