HDU 2553 N皇后问题(DFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553

N皇后问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5171    Accepted Submission(s): 2357

Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。

你的任务是,对于给定的N,求出有多少种合法的放置方法。

 

 

Input 共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。  

 

Output 共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。  

 

Sample Input 1 8 5 0  

 

Sample Output 1 92 10  

 

Author cgf  

 

Source
2008 HZNU Programming Contest  

 

Recommend lcy   搜索水题。。。。不过这题得打表,如果每次都搜索的话会超时。。。    By LFENG

  #include <stdio.h>
int  s[ 12 ] = { 0 1 0 0 2 10 4 40 92 352 724 };
int  main()
{
    
int  n;
    
while (scanf( “%d” , &n) != EOF && n)
        printf(
“%d\n” , s[n]);
    
return   0 ;
}

     

 

 By LFENG

  #include <stdio.h>
#include <string.h>
#include <stdlib.h>
int  n, sum;
int  g[ 12 ], ti[ 12 ];
int  check( int  cur)
{
    
int  i;
    
for (i =  0 ; i < cur; i++)
        
if (abs(cur – i) == abs(g[cur] – g[i]) || g[i] == g[cur]) return   0 ;
    
return   1 ;
}
void  dfs( int  cur)
{
    
int  i, next;
    
if (cur == n)
    {
        sum++;
        
return  ;
    }
    
for (i =  0 ; i < n; i++)
    {
        g[cur] = i;
        
if (!check(cur)) continue ;
        dfs(cur + 
1 );
    }
}
int  main()
{
    
int  num;
    
for (n =  1 ; n <=  10 ; n++)
    {
        memset(g, 
0 sizeof (g));
        sum = 
0 ;
        dfs(
0 );
        ti[n] = sum;
    }
    
while (scanf( “%d” , &num) != EOF && num)
        printf(
“%d\n” , ti[num]);
    
return   0 ;
}
    原文作者:LFENG
    原文地址: https://www.cnblogs.com/lfeng/archive/2013/05/18/3084787.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞