資源簡介
在n*n格的棋盤上放置彼此不受攻擊的n個皇后。按照國際向其的規則,皇后可以攻擊同一行、同一列、同一斜線上的棋子。

代碼片段和文件信息
#include
long?nQueen(int?n);
int?abs(int?);
//主函數;
int?main(){
int?numberresult;
cout<<“輸入要放置的皇后個數:“;
cin>>number;
????result=nQueen(number);
cout< return?0;
}
//類和函數;
class?Queen?{
friend?long?nQueen(int);
private:
bool?Place(int?k);
void?Backtrack(int?t);
int?n???//皇后個數;
*x;??//當前解;x[i]表示皇后放在棋盤的第i?行的第x[i]列;
long?sum;??//當前已找到的可行方案數;
};
bool?Queen::Place(int?k)
{
for(int?j=1;j if((abs(k-j)==abs(x[j]-x[k]))?||(x[j]==x[k]))?return?false;
return?true;
}
void?Queen::Backtrack(int?t)
{
if(t>n)?{sum++;???//成功放置一次,方案數加1;
for(int?row=1;row for(int?col=1;col if(x[row]==col)?cout<<“1“<<“?“;????//當row行的列的值等于x[row]的值時,
?? else?cout<<“0“<<“?“;???????????//就證明這一行的皇后放在該列,即把該位置標志為1;否則為0
}
cout< }
cout< }
else?{
for(int?i=1;?i<=n;i++){
x[t]=i;??????????
if(Place(t))?Backtrack(t+1);
}
}
}
long?nQueen(int?n)
{
Queen?X;
X.n=n;
X.sum=0;
int?*p=new?int?[n+1];
for(int?i=1;i<=n;i++)
p[i]=0;
X.x=p;
X.Backtrack(1);
delete?[]p;
return?X.sum;
}
int?abs(int?a)
{?int?b;
if(a>=0)?return?a;
else?b=0-a;
?return?b;
}
?
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????1348??2000-12-03?09:42??n后問題.cpp
-----------?---------??----------?-----??----
?????????????????1348????????????????????1
- 上一篇:平時練習——操作系統題庫
- 下一篇:軟件技術專業調研報告.doc
評論
共有 條評論