- 2
- 0
- 约2.93千字
- 约 6页
- 2018-02-24 发布于河南
- 举报
随机与回溯结合解决N后问题
《算法分析与设计》实验报告
实验名称 随机与回溯结合解决N后问题 课程名称 算法分析与设计
姓 名 专业班级 计算机08-1班 学 号
日期 2011.06.01 地点 西一楼207
成绩 教师
1.实验目的
(1)掌握N后问题:N皇后问题是在N*N的棋盘上,放置N个皇后,要求每一横行每一列,每一对角线上均只能放置一个皇后,求解可能的方案及方案数。
(2) 利用回溯方法设计的算法,掌握算法设计的基本步骤回溯法
随机法与回溯法结合:
4.总结与回顾
n皇后问题一般是采用回溯法求解,但当n值较大时,回溯算法效率较低,所以此次作业中将随机算法和回溯法结合起来求解n皇后问题,以提高算法的效率。引入随机算法,能保证每次找出的解是正确的,但可能在一次求解过程中找不出可行解,这一点在程序运行过程中能得到体现。
通过本实验,我对n后问题的理解有了进一步的加深;更重要的是对回溯算法的思想有了更深刻的理解,通过回溯算法与随机算法的比较,了解了回溯算法在n值较大的情况下存在的不足,同时也了解了随机算法在此时所具备的优越性。在整个实验的过程中,我对算法的基本设计过程有了系统的操作与理解。但由于编程能力的限制,在算法实现过程中遇到了一些障碍,不过在同学的帮助下克服了,最终完成实验。
附:源代码
#include iostream
#include cmath
#include time.h
using namespace std;
int count,rand_count;
///判断第k个皇后的(列)位置是否满足要求
bool place(int x[],int k)
{
int i;
for (i = 1;ik;++i)
{
if ( (x[i]==x[k])||( abs(x[i]-x[k])==abs(i-k) ) )
{
return false;
}
}
return true;
}
///回溯法求解n皇后问题
void Back_n_queens(int n,int x[])
{
int k = 1;
x[k] = 0;
while (k0)
{
++x[k];
while ( (x[k]=n)(!place(x,k)) )
{
++x[k];
}
if (x[k]=n)
{
if (k==n)
break;
else
{
++k;
x[k] = 0;
}
}
else
{
x[k] = 0;
--k;
}
}
}
///回溯法+随机法
void Rand_Back_n_queens(int n,int x[])
{
int k,mid;
mid = n/3 + 1;
time_t t;
srand((unsigned) time(t));
for (k = 1;k=mid;++k)
{
x[k] = rand()%n + 1;
while (!place(x,k))
{
x[k] = rand()%n + 1;
}
printf(Random x[%d] = %d\n,k,x[k]);
}
k = mid+1;
x[k] = 0;
while (kmid)
{
++x[k];
while ( (x[k]=n)(!place(x,k)) )
{
++x[k];
}
if (x[k]=n)
{
if (k==n)
break;
else
{
++k;
x[k] = 0;
原创力文档

文档评论(0)