对角线的推算,如下图:
代码中的数组解释:
place[i]代表第i行皇后放在哪一列; 比如place[0]=1代表第0行皇后放在第1列 col[i]代表第i列有没有放皇后; 比如col[0]=false代表第0列没有放皇后 dg[i]代表第i条对角线有没有放皇后; 比如dg[0]=false代表第0条没有放皇后 udg[i]代表第i条反对角线有没有放皇后; 比如udg[0]=false代表第0条反对角线没有放皇后
代码:
# include <iostream>
using namespace std;
const int N = 9 + 10 ;
int place[ N] ;
bool col[ N] , dg[ 2 * N] , udg[ 2 * N] ;
int n;
void dfs ( int u)
{
if ( u == n)
{
for ( int i = 0 ; i < n; i ++ )
{
int j = place[ i] ;
for ( int k = 0 ; k < n; k ++ )
{
if ( j != k) cout << '.' ;
else cout << 'Q' ;
}
cout << endl;
}
cout << endl;
}
for ( int i = 0 ; i < n; i ++ )
{
if ( ! col[ i] && ! dg[ u + i] && ! udg[ u - i + n - 1 ] )
{
place[ u] = i;
col[ i] = true , dg[ u + i] = true , udg[ u - i + n - 1 ] = true ;
dfs ( u + 1 ) ;
col[ i] = false , dg[ u + i] = false , udg[ u - i + n - 1 ] = false ;
}
}
}
int main ( )
{
cin >> n;
dfs ( 0 ) ;
return 0 ;
}