lv 算法与回溯法相结合解决n皇后问题

#include <iostream>
#include <time.h>
using namespace std;

 

//随机数类
const unsigned long maxshort= 6553L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;

class RandomNumber
{
 public:
 //构造函数,缺省值0表示由系统自动产生种子
  RandomNumber(unsigned long s = 0);
  //产生0:n-1之间的随机整数
  unsigned short Random(unsigned long n);
  //产生[0,1]之间的随机实数
  double fRandom(void);
 private:
    //当前种子
        unsigned long randSeed;
};

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);
}

 

class Queen
{
   friend bool nQueen(int);
   private:
    bool Place(int k);  // 测试皇后k置于第x[k]列的合法性
    bool Backtrack(int t);         // 解n后问题的回溯法
    bool QueensLV(int stopVegas);  // 随机放置n个皇后拉斯维加斯算法
    int n, *x, *y;
};
#include <iostream>
using namespace std;
 
bool Queen::Place(int k)
{
 // 测试皇后k置于第x[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::Backtrack(int t)
{
 // 解n后问题的回溯法
 if(t > n)
 {
  for(int i=1; i<=n; ++i)
   y[i] = x[i];
  return true;
 }
 else
  for(int i=1; i<=n; ++i)
  {
   x[t] = i;
   if(Place(t) && Backtrack(t+1))
    return true;
  }
  return false;
}

bool Queen::QueensLV(int stopVegas)
{
 // 随机放置n个皇后的拉斯维加斯算法
 RandomNumber rnd;    // 随机数产生器
 int k = 1;           // 下一个放置的皇后编号
 int count = 1;
 // 1 <= stopVegas <= n 表示允许随机放置的皇后数
 while((k <= stopVegas) && (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)]; 
     k++;}// 随机位置
   }
 return (count > 0);   // count>0表示放置位置成功
}


 
bool nQueen(int n)
{
 // 与回溯法结合的解n后问题的拉斯维加斯算法
 Queen X;
 // 初始化X
 X.n = n;
 int *p = new int[n+1];
 int *q = new int[n+1];
 for(int i=0; i<=n; ++i)
 {
  p[i] = 0;
  q[i] = 0;
 }
 X.y = q;
 X.x = p;
 // 设置随机放置皇后的个数
 int stop = 8;
 if(n > 15)
  stop = n-15;
 bool found = false;
 while(! X.QueensLV(stop));
 // 算法的回溯搜索部分
 if(X.Backtrack(stop+1))
 {
  for(int i=1; i<=n; ++i)
   cout << p[i] << " ";
  found = true;
 }
 cout << endl;
 delete [] p;
 delete [] q;
 return found;
}
 
void main()
{   int n;
 cout<<"请输入皇后的个数";
 cin>>n;
 nQueen(n);
 
}

 

 

 

红色的部位在调试时总会出现(编译连接都正确,关于这两个...dll我system32文件中都含有)

Loaded 'ntdll.dll', no matching symbolic information found.
Loaded 'C:/WINDOWS/system32/kernel32.dll', no matching symbolic information found.
First-chance exception in 3.exe: 0xC0000005: Access Violation.

还请各位有柴的帅哥美女看一下怎么改。在这先谢了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值