杭电 2553 N皇后问题 (dfs)

Description

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 
你的任务是,对于给定的N,求出有多少种合法的放置方法。 

 

Input

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

Output

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

Sample Input

1
8
5
0
 

Sample Output

1
92
10
 
N行N列N个皇后,每行有一个皇后,先排第一行,找到合适的位置,用数组记录皇后在这一行的位置,标记整个列,其他的皇后都不能排在这一列,再判断是否有对角线不合适的情况。
 
 1 #include<cstdio>
 2 #include<string.h>
 3 int n,key[11],map[11],ans,sum[11];
 4 void dfs(int x)
 5 {
 6     int i,j,k;
 7     if(x == n+1)
 8     {
 9         ans++;
10         return ;
11         }
12         
13     for(i = 1 ; i <= n ; i++)
14     {
15         if(key[i] == 0)
16         {
17             k=1;
18             map[x]=i;            //记录皇后在x行的i列。
19             for(j = 1 ; j < x ; j++)
20             {
21                 if(map[x] == map[j]+(x-j) || map[x] == map[j]-(x-j))
22                 {
23                     k=0;
24                     break;
25                 }
26             }
27             if(k == 1)
28             {
29                 key[i]=1;            //标记整个列
30                 dfs(x+1);
31                 key[i]=0;            //清除标记,开始下一种情况
32             }
33         }
34         
35     }
36 }
37 int main()
38 {
39     for(n = 1 ; n <= 10 ;n++)
40     {
41         ans=0;
42         memset(map,0,sizeof(map));
43         memset(key,0,sizeof(key));
44         dfs(1);
45         sum[n]=ans;
46     }
47     while(scanf("%d",&n)&&n)
48     {
49         printf("%d
",sum[n]);
50     }
51 }
——将来的你会感谢现在努力的自己。
原文地址:https://www.cnblogs.com/yexiaozi/p/5717536.html