lv 算法与回溯法相结合解决n皇后问题
2011-06-07 14:57
316 查看
#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.
还请各位有柴的帅哥美女看一下怎么改。在这先谢了
#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.
还请各位有柴的帅哥美女看一下怎么改。在这先谢了
相关文章推荐
- 回溯算法——解决n皇后问题
- 算法学习:回溯解决4皇后问题
- 国际象棋“皇后”问题的回溯算法
- 求 N 皇后问题回溯算法
- 回溯算法n皇后问题
- 国际象棋“皇后”问题的回溯算法
- 算法分析与设计回溯法之n皇后问题
- 经典回溯算法之n皇后问题
- 国际象棋“皇后”问题的回溯算法
- 【算法分析】回溯法解八皇后问题(n皇后问题)
- 回溯算法基础---皇后问题,骑士游历,迷宫求解
- JAVA使用回溯法解决n皇后问题的算法
- “皇后”问题的回溯算法
- 经典回溯算法之N皇后问题
- 回溯算法 8皇后问题的一种解法 适合初学者观察整个回溯的过程
- 回溯经典算法之四皇后问题
- 国际象棋“皇后”问题的回溯算法
- 国际象棋“皇后”问题的回溯算法
- C#WPF实现回溯算法解决八皇后问题
- 回溯算法之N皇后问题的求解