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
浙公网安备 33010602011771号