N后问题(拉斯维加斯算法实现)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:n 后问题(用拉斯维加斯算法) 程序清单: Randomnumber.h #include <iostream> #include "time.h" using namespace std; //随机数类 const unsigned long maxshort=65536L; const unsigned long multiplier=1194211693L; const unsigned long adder=12345L; class RandomNumber { private: //当前种子 unsigned long randSeed; public: //构造函数,默认值 0 表示由系统自动产生种子 RandomNumber(unsigned long s=0); //产生 0:n-1 之间的随机整数 unsigned short Random(unsigned long n); //产生[0,1)之间的随机实数 double fRandom(void); }; //产生种子 RandomNumber::RandomNumber(unsigned long s) { if(s==0) randSeed=time(0); //用系统时间产生种子 else randSeed=s; //由用户提供种子 } //产生 0:n-1 之间的随机整数 unsigned short RandomNumber::Random(unsigned long n) { randSeed=multiplier*randSeed+adder; return (unsigned short) ((randSeed>>16)%n); } //产生[0,1)之间的随机实数 double RandomNumber::fRandom(void) { return Random(maxshort)/double(maxshort);
百度文库
} void nQueen(int n) { Queen X; //初始化 X.n=n; int * p=new int[n+1]; for(int i=0;i<=n;i++) p[i]=0; X.x=p; //反复调用随机放置 n 个皇后拉斯维加斯算法,直至放置成功 while(X.QueensLV()) { cout<<"结果是:"<<endl; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(j==p[i]) cout<<"Q"<<" "; if(j!=p[i]) cout<<"*"<<" "; } cout<<endl; } break; } delete []p; } void main() { int n; cout<<"输入皇后个数:"<<endl; cin>>n; nQueen(n); system("pause"); } 运行结果: //解 n 后问题的拉斯维加斯算法
int count=1; while((k<=n)&&(count>0)) { count=0; for(int i=1;i<=n;i++) { x[k]=i; if(Place(k)) y[count++]=i; } if(count>0) x[k++]=y[rnd.Random(count)];//随机位置 } return (count>0); //count>0 表示放置成功
} Nqueen LasVegas.cpp #include<iostream> #include "math.h" #include "randomnumber.h" using namespace std; class Queen { friend void nQueen(int); private: bool Place(int k); //测试皇后 k 置于第 x[k]列的合法性 bool QueensLV(void); //随机放置 n 个皇后拉斯维加斯算法 int n, //皇后个数 *x,y[1000]; //解向量 }; bool Queen::Place(int k) { for(int j=1;j<k;j++) if((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) return false; return true; } bool Queen::QueensLV(void) 斯维加斯算法 { RandomNumber rnd; int k=1; //随机数产生器 //下一个放置的皇后编号 //QueensLV(void)实现在棋盘上随机放置 n 个皇后拉 //Place(k)用于测试将皇后 k 置于第 x[k]列的合法性
相关文档
最新文档