LeeBlog

导航

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;
}

posted on 2011-05-10 19:18  LeeBlog  阅读(231)  评论(0编辑  收藏  举报