HDU 2553 N皇后问题 DFS 简单题

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

 

只需要开一个数组,vis[i] 表示第i行的皇后要放在vis[i]这一列。
 
HDU 2553 N皇后问题 DFS 简单题
 1 #include<cstdio>

 2 #include<cstring>

 3 int vis[12];

 4 int n;

 5 int ans;

 6 bool judge(int cnt,int t)

 7 {

 8     for(int i=1;i<cnt;i++)

 9         if(vis[i]==t)

10             return false;

11     for(int i=1;i<cnt;i++)

12         if(t-vis[i]==cnt-i||vis[i]-t==cnt-i)

13             return false;

14     return true;

15 }

16 void dfs(int cnt)

17 {

18     if(cnt==n+1)

19     {

20         ans++;

21         return ;

22     }

23     for(int i=1;i<=n;i++)

24     {

25         if(judge(cnt,i)&&!vis[cnt])

26         {

27             vis[cnt]=i;

28             dfs(cnt+1);

29             vis[cnt]=0;

30         }

31     }

32 

33 }

34 int main()

35 {

36     while(scanf("%d",&n))

37     {

38         if(n==0)

39             break;

40         memset(vis,0,sizeof(vis));

41         ans=0;

42         dfs(1);

43         printf("%d\n",ans);

44     }

45     return 0;

46 }
第一份代码

 

上面的代码tle了,所以我直接用它来打表。
 
HDU 2553 N皇后问题 DFS 简单题
 1 #include<cstdio>

 2 int vis[11]={0,1,0,0,2,10,4,40,92,352,724};

 3 int main()

 4 {

 5     int n;

 6     while(scanf("%d",&n))

 7     {

 8         if(n==0)

 9             break;

10         printf("%d\n",vis[n]);

11     }

12     return 0;

13 }
提交代码

 

 
 
 
 

你可能感兴趣的:(HDU)