HDU 2553 N皇后问题
这题跟其实是以DFS经典题,如果按一般思路一行一行来选,那样会灰常暴力,但是仔细思考可得这题可简化思路,因为没行只能放一个,所以只要搜索N个就行了。。。。。 而对于每一个只要判断跟前面是否有冲突就行了( DP 思想,分步来 )。
#include<stdio.h> #include<string.h> int n,map[20],des[20],cnt,num[11]; void DFS( int num ) { if( num == n + 1 ) { ++cnt; return ; } for( int i = 1; i <= n; ++i ) { if( !des[i] )//判断是否在同一行 { int f = 1; map[num] = i; for( int j = 1; j < num; ++j ) if( ( map[num] - num == map[j] - j ) || ( map[num] + num ) == map[j] + j ) {//判断是否在对角线上 f = 0; break; } if( f ) { des[i] = 1; DFS( num + 1 );//printf( "%d\n",num + 1 ); des[i] = 0; } } } } void chart( ) { for( int i = 1; i < 11; ++i ) { memset( map,0,sizeof( map ) ); memset( des,0,sizeof( des ) ); cnt = 0,n = i,DFS( 1 ),num[i] = cnt; } } int main( ) { chart( ); int n; while( scanf( "%d",&n ),n ) printf( "%d\n",num[n] ); return 0; }
本人还是新手 ,转载请注明来自Lvsi‘s home