《算法基础》 DFS
1.排列数字
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 10 ;
int path[ N] ;
int vis[ N] ;
int n;
void dfs ( int u)
{
if ( u == n) {
for ( int i = 0 ; i < n; i ++ ) cout << path[ i] << " " ;
cout << endl;
return ;
}
for ( int i = 1 ; i <= n; i ++ ) {
if ( ! vis[ i] ) {
path[ u] = i;
vis[ i] = 1 ;
dfs ( u + 1 ) ;
vis[ i] = 0 ;
path[ u] = 0 ;
}
}
}
int main ( )
{
cin >> n;
dfs ( 0 ) ;
return 0 ;
}
2. n皇后
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 20 ;
char map[ N] [ N] ;
int col[ N] , dg[ N] , udg[ N] ;
int n;
void dfs ( int u)
{
if ( u == n) {
for ( int i = 0 ; i < n; i++ ) cout << map[ i] << endl;
cout << endl;
return ;
}
for ( int i = 0 ; i < n; i ++ ) {
if ( ! col[ i] && ! dg[ u + i] && ! udg[ n + i - u] ) {
map[ u] [ i] = 'Q' ;
col[ i] = dg[ u + i] = udg[ n + i - u] = 1 ;
dfs ( u + 1 ) ;
map[ u] [ i] = '.' ;
col[ i] = dg[ u + i] = udg[ n + i - u] = 0 ;
}
}
}
int main ( )
{
cin >> n;
for ( int i = 0 ; i < n; i ++ ) {
for ( int j = 0 ; j < n; j ++ ) {
map[ i] [ j] = '.' ;
}
}
dfs ( 0 ) ;
return 0 ;
}
}
3.n皇后原始
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 20 ;
char map[ N] [ N] ;
int row[ N] , col[ N] , dg[ N] , udg[ N] ;
int n;
void dfs ( int x, int y, int s)
{
if ( y >= n) {
y = 0 ;
x ++ ;
}
if ( x == n) {
if ( s == n) {
for ( int i = 0 ; i < n; i ++ ) cout << map[ i] << endl;
cout << endl;
}
return ;
}
dfs ( x, y + 1 , s) ;
if ( ! row[ x] && ! col[ y] && ! dg[ x + y] && ! udg[ x - y + n] ) {
map[ x] [ y] = 'Q' ;
row[ x] = col[ y] = dg[ x + y] = udg[ x - y + n] = 1 ;
dfs ( x, y + 1 , s + 1 ) ;
row[ x] = col[ y] = dg[ x + y] = udg[ x - y + n] = 0 ;
map[ x] [ y] = '.' ;
}
}
int main ( )
{
cin >> n;
for ( int i = 0 ; i < n; i ++ )
for ( int j = 0 ; j < n; j ++ )
map[ i] [ j] = '.' ;
dfs ( 0 , 0 , 0 ) ;
return 0 ;
}