1310 N皇后问题
http://www.bianchengla.com/course/cpp/practise/problem?id=1310
今天在北航oj上看到这道N皇后问题,记得做八皇后问题还是在大一c语言课上学的,当时还没接触算法,自然不懂回溯和递归,所以对八皇后的解法也只是理解了个大概,今天做到这题,上网搜了一下具体的做法,搜到一篇讲解很详细的blog:http://blog.csdn.net/hackbuteer1/article/details/6657109
看明白后也就觉得不难写了,要做的就是算法的优化。自己写了非递归和递归的程序,位运算那个还是要好好理解一下吧。
非递归:
View Code
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <iostream> #include <algorithm> #include <queue> #include <math.h> #include <map> #define N 13 #define INF 1000000 using namespace std ; int pos[N] , n ; bool check( int row , int col ) { int i ; for ( i = 1 ; i <= n ; i++ ) if ( pos[i] == col || abs( i - row ) == abs( pos[i] - col )) { return false ; } return true ; } int main() { int cas , i , j , sum ; cin>>cas ; while( cas-- ) { cin>>n ; for ( i = 0 ; i <= n ; i++ ) pos[i] = -INF ; i = j = 1 ; sum = 0 ; while( i <= n ) { while( j <= n ) { if ( check( i , j )) { pos[i] = j ; j = 1 ; break ; } else { j++ ; } } if ( pos[i] == -INF ) { if ( i == 1 ) break ; else { i-- ; j = pos[i] + 1 ; pos[i] = -INF ; continue ; } } if ( i == n ) { sum++ ; j = pos[i] + 1 ; pos[i] = -INF ; continue ; } i++ ; } cout<<sum<<endl ; } return 0 ; }
递归:
View Code
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <iostream> #include <algorithm> #include <queue> #include <math.h> #include <map> #define N 13 #define INF 1000000 using namespace std ; int pos[N] , n , sum ; bool check( int row , int col ) { int i ; for ( i = 1 ; i < row ; i++ ) if ( pos[i] == col || abs( i - row ) == abs( pos[i] - col )) return false ; return true ; } void dfs( int row ) { if ( row > n ) { sum++ ; return ; } for ( int i = 1 ; i <= n ; i++ ) if ( check( row , i )) { pos[row] = i ; dfs( row + 1 ) ; } } int main() { int cas ; cin>>cas ; while( cas-- ) { cin>>n ; sum = 0 ; dfs( 1 ) ; cout<<sum<<endl ; } return 0 ; }