回溯法思想的应用
文章目录 回溯法思想的应用 1、非递归实现皇后问题 2、递归算法解决皇后问题 3、素数圈
1、非递归实现皇后问题
# 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 ;
}
2、递归算法解决皇后问题
# 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 ;
}
3、素数圈
# 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 ;
}