?? n皇后問(wèn)題.cpp
字號(hào):
#include<iostream>
using namespace std;
/*
解空空間是完全N叉樹(shù)
x[i]表示第i個(gè)皇后放在第i行的第x[i]列
*/
class Queen
{
friend int nQueen(int);
private:
bool Place(int k);
void Backtrack(int t);
int n;
//皇后個(gè)數(shù)
int *x;
//當(dāng)前解
long sum;
//當(dāng)前已經(jīng)找到的可行方案數(shù)
};
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(int t)
{
if ( t > n )
{
sum++;
}
else
{
for( int i = 1; i <= n; ++i )
//如果是全排列的則需要回溯時(shí)復(fù)原原來(lái)的值
//完全N叉樹(shù)確定值范圍則不需要這樣
{
x[t] = i;
//將第t個(gè)元素放在i列
if ( Place(t) )
{
Backtrack( t + 1 );
}
}
}
}
int nQueen( int n )
{
Queen X;
//初始化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(1);
delete []p;
return X.sum;
}
void Queen::Backtrack(void)
{
x[1] = 0;
int k = 1;
while( k > 0 )
{
x[k] += 1;
//選中第x[k]列
while( ( x[k] <= n ) && !( Place(k) ) )
{
x[k] += 1;
}
if( x[k] <= n )
{
if ( k == n )
{
sum++;
}
else
{
++k;
x[k] = 0;
}
}
else
{
--k;
//上一行的列繼續(xù)調(diào)整
}
}
}
int main()
{
return 0;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -