实验8
拉斯维加斯算法结合回溯法求解n后问题
设stopVgas为采用拉斯维加斯算法随机排设的皇后个数,对n、stopVgas进行多组不同取值时,记录程序成功率、运行时间
① 参考课件、教材、其它资料,将伪代码改成正式程序代码。
② 用一组小数据,手工验证程序正确性,发现可能的错误并修复。
③ 自己设计参数n、stopVgas的不同取值(可参考教材所给表格)。
④ 对不同参数进行运行,检测程序运行时间,观察并记录结果和发现。
前stop个随机放能放的位置,然后stop+1开始用回溯法放。
拉斯维加斯:比如四皇后,按回溯法第一个本该放在第一行第一列那个位置,现在用y数组保存第一行能放的位置,1、2、3、4都可以,y[]={1,2,3,4}。然后生成一个y数组内所有数范围内的随机数,比如2,那么现在第一个就放在了第一行第2列的位置。然后下一行(是按行一个一个放,第一个就是第一行那个,第二个就是第二行那个)就找能放的位置,第1、2、3列由于冲突对角线和列都不能放,y[]={4},就只能放在第二行第4列了(拿四皇后做例子是有点少哦)。
#include <iostream>
#include <cmath>
#include <time.h>
#include "RandomNumber.h"
using namespace std;
class Queen
{
friend bool nQueen(int,int);
private:
bool Place(int k);//测试皇后k置于第x[k]列的合法性
bool Backtrack(int t);//解n后问题的回溯法
bool QueensLV(int stopVegas);//随机放置n个皇后拉斯维加斯算法
int n,*x,*y,sv;
};
bool Queen::Place(int k)
{//测试皇后k置于第x[k]列的合法性 (第k行,第x[k]列)
for(int j=1;