实验二:约束满足问题
一、实验目的
求解约束满足问题;
使用回溯搜索算法求解八皇后问题。
二、实验平台
课程实训平台https://www.educoder.net/paths/369
三、实验内容及步骤
实训内容:2-4 第六章 约束满足问题
四、实验报告要求
1.说明实验的方法和步骤;
2. 对算法的原理进行说明;
3.给出算法源程序;
4.对实验结果进行分析。
实验二:约束满足问题
一、实验目的
1.求解约束满足问题;
2. 使用回溯搜索算法求解八皇后问题。
二、实验内容及步骤
1.算法的原理
回溯搜索算法:回溯是搜索算法中的一种控制策略。为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。
2.实验的方法和步骤
①根据作业中给出的不完整代码,a[]表示棋盘的行,b[]表棋盘的列,c[]、d[]表示斜线
②首先一行一行地搜索,从每行第一列搜索到这行的第八列
②检查当前位置是否能够放皇后,假设可以则数组值标记为1
③进入下一个循环,如果发现出现冲突,则进行回溯,把之前设置为1的还原为0
3.给出算法源程序
#include<iostream>
using namespace std;
int a[9];
int b[9]={0};
int c[16]={0};
int d[16]={0};
int sum=0;
void searchh(int i)
{
for(int j=1;j<=8;j++)
{
if((!b[j])&&(!c[i+j])&&(!d[i-j+7]))//每个皇后都有八个位置(列)可以试放
{
/********** Begin **********/
if(i == 8){
sum++;
return;
}
b[j]=1;
c[i+j]=1;
d[i-j+7]=1;
searchh(i+1);
b[j]=0;
c[i+j]=0;
d[i-j+7]=0;
/********** End **********/
}
}
}
int main()
{
searchh(1);
cout<<sum;
return 0;
}
4.对实验结果进行分析
经过测试,能正确输出预测答案92,正确。
时间复杂度为O(n!)。