69,371
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <windows.h>
using namespace std;
const int MAX_QUEEN = 16;
int key[MAX_QUEEN];
int collock[MAX_QUEEN][MAX_QUEEN];
int showkey;//是否显示解
int Place1 (int k, int i);
void NQueens1(int k, int n);
int Place2 (int start, int k, int n);
void NQueens2(int k, int n);
void show(int n);
inline int ABS(int n)
{
return n > 0 ? n : -n;
}
int main()
{
showkey = 0;
cout<<"皇后数在13的时候算法1需要时间40秒左右"<<endl;
cout<<"如果时间不允许请把main函数中"<<endl;
cout<<"for (int i = 0; i<14; i++)改为"<<endl;
cout<<"for (int i = 0; i<13; i++)"<<endl;
cout<<"皇后数\t算法1\t算法2"<<endl;
for (int i = 0; i<14; i++)
show(i);
return 0;
}
int Place1(int k, int i)
{
for (int j = 0; j<k; j++)
if ( key[j] == i || ABS(key[j]-i) == ABS(j-k))
return 0;
return 1;
}
void NQueens1(int k, int n)
{
for (int i = 0; i<n; i++)
if (Place1(k, i))
{
key[k] = i;
if (k==n-1)
{
if (showkey)
{
for (int j = 0; j<n; j++)
cout<<key[j]+1<<' ';
cout<<endl;
}
}
else
{
NQueens1(k+1, n);
}
}
}
int Place2(int start, int k, int n)
{
for (int i = start + 1; i<n; i++)
if (!collock[k][i])
return i;
return -1;
}
void NQueens2(int k, int n)
{
for (int i = 0; i<n; i++)
collock[k][i] = 0;
for (int i = 0; i<k; i++)
{
int l = ABS(k-i);
collock[k][key[i]] = 1;
if (key[i] - l>=0)
collock[k][key[i] - l] = 1;
if (key[i] + l<n)
collock[k][key[i] + l] = 1;
}
int start = -1;
while ( (start = Place2(start, k, n)) != -1)
{
key[k] = start;
if (k==n-1)
{
if (showkey)
{
for (int j = 0; j<n; j++)
cout<<key[j]+1<<' ';
cout<<endl;
}
}
else
{
NQueens2(k+1, n);
}
}
}
void show(int n)
{
static DWORD stime, etime;
cout<<n<<'\t';
stime = GetTickCount();
NQueens1(0, n);
etime = GetTickCount();
cout<<etime-stime<<"\t";
stime = GetTickCount();
NQueens2(0, n);
etime = GetTickCount();
cout<<etime-stime<<endl;
}