?? n 皇后問題非遞歸.cpp
字號:
#include<iostream.h>
#include "math.h"
class QUEEN
{
public:
friend int nQueen(int);
private:
bool Place(int k);
void Backtrack(void);
int n,*x;
long sum;
};
int nQueen(int n)
{
QUEEN x;
x.n=n;
x.sum=0;
int *p=new int [n+1];
for(int i=0;i<=n;i++)
p[i]=0;
x.x=p;
x.Backtrack();
delete[]p;
return x.sum;
}
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;
}
void QUEEN::Backtrack(void)
{
x[1]=0;
int k=1;
while (k >0)
{
x[k]+=1;
while ((x[k]<=n)&&!(Place(k))) x[k]+=1;
if (x[k]<=n)
{ if (k==n)
{sum++;
cout << "n皇后問題的第"<<sum<<"個"<<"可行解的坐標為:"<<endl;
for(k=1;k<=n;k++)
cout <<"( "<<k<<","<<x[k]<<")"<<endl;
cout << "********"<<endl;
}
else
{
k++;
x[k]=0;
}}
else k--;
}
}
void main()
{
int n;
cout <<"***************N 皇后問題非遞歸*************** "<<endl;
cout << endl;
cout <<"請輸入皇后的個數 n: "<<endl;
cin>>n;
cout<<nQueen( n)<<endl;
cout <<"***************N 皇后問題結束*************"<<endl;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -