文章目录  回溯法思想的应用 1、非递归实现皇后问题 2、递归算法解决皇后问题 3、素数圈   
 
# include <stdio.h> # include <stdlib.h> # define  bool  char # define  true  1 # define  false  0 # define   N  110 int  n; 
bool col[ N] ;   
bool dg[ N] ;   
bool udg[ N] ;   
char  g[ N] [ N] ; 
int  solution; 
void  dfs ( int  u) 
{ if ( u== n)     { solution++ ; for ( int  i= 0 ; i< n; i++ )  { for ( int  j= 0 ; j< n; j++ ) { printf ( "  " ) ; printf ( "%c" , g[ i] [ j] ) ; } printf ( "\n" )  ;  }  printf ( "\n" )  ;     return  ; } for ( int  i= 0 ; i< n; i++ )     { if ( ! col[ i] && ! dg[ u+ i] && ! udg[ u- i+ n] ) { g[ u] [ i] = 'Q' ; col[ i] = dg[ u+ i] = udg[ u- i+ n] = true; dfs ( u+ 1 ) ; col[ i] = dg[ u+ i] = udg[ u- i+ n] = false;   g[ u] [ i] = '*' ;      } } 
} 
int  main ( ) 
{ scanf ( "%d" , & n) ; for ( int  i= 0 ; i< n; i++ )  for ( int  j= 0 ; j< n; j++ ) g[ i] [ j] = '*' ;      dfs ( 0 ) ;   printf ( "%d皇后问题共有%d种摆放方案" , n, solution)  ; return  0 ; 
} 
# include <stdio.h> # include <stdlib.h> # define  bool  char # define  true  1 # define  false  0 # define   N  110 int  n; 
bool col[ N] ;   
bool dg[ N] ;   
bool udg[ N] ;   
char  g[ N] [ N] ; 
int  solution; 
void  dfs ( int  u) 
{ if ( u== n)     { solution++ ; for ( int  i= 0 ; i< n; i++ )  { for ( int  j= 0 ; j< n; j++ ) { printf ( "  " ) ; printf ( "%c" , g[ i] [ j] ) ; } printf ( "\n" )  ;  }  printf ( "\n" )  ;     return  ; } for ( int  i= 0 ; i< n; i++ )     { if ( ! col[ i] && ! dg[ u+ i] && ! udg[ u- i+ n] ) { g[ u] [ i] = 'Q' ; col[ i] = dg[ u+ i] = udg[ u- i+ n] = true; dfs ( u+ 1 ) ; col[ i] = dg[ u+ i] = udg[ u- i+ n] = false;   g[ u] [ i] = '*' ;      } } 
} 
int  main ( ) 
{ scanf ( "%d" , & n) ; for ( int  i= 0 ; i< n; i++ )  for ( int  j= 0 ; j< n; j++ ) g[ i] [ j] = '*' ;      dfs ( 0 ) ;   printf ( "%d后问题共有%d种摆放方案" , n, solution)  ; return  0 ; 
} 
# include  <stdio.h> # include  <math.h> # include  <stdlib.h> # include  <stdbool.h> # define  N  100 int  n, x[ N] ; 
bool vis[ N] , flag= false; 
bool checkPrime ( int  t) 
{ for ( int  j= 2 ; j<= sqrt ( t) ; j++ ) { if ( t% j== 0 ) return  false; } return  true; 
} 
void  dfs ( int  i) 
{ if ( i> n) { if ( flag) { printf ( "围成的圈是:" ) ; for ( int  j= 1 ; j< i; j++ ) printf ( "%d " , x[ j] ) ; exit ( 0 ) ; } flag= true; } else { for ( int  j= 1 ; j<= n; j++ ) { if ( ! vis[ j] && checkPrime ( x[ i- 1 ] + j) ) { vis[ j] = true; x[ i] = j; dfs ( i+ 1 ) ; vis[ j] = false; } } } 
} 
int  main ( ) 
{ scanf ( "%d" , & n) ; dfs ( 1 ) ; return  0 ; 
}