在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
每次把第k个皇后放在第k行,这样就不用考虑是否在同一行的可能,只需判断每个皇后是否在同一列,一个对角线即可。
最后输出时,多组数据,可能会有包含的情况,压缩时间。
1 #include<iostream>
2 #include<cstdio>
3 int Queen[20],n;
4 int dp[15];
5 int dfs(int k)
6 {
7 if (k>n)
8 return 1;
9 int ans = 0;
10 for (int i = 1 ;i<= n ;i++)
11 {
12 int nx = k, ny = i;//把第k个皇后放在第k行
13 bool isOk = true;
14 for (int j = 1; j< k && isOk ;j++)
15 {
16 int prex = j, prey = Queen[j];//放过的皇后
17 if (prey == ny || prey-prex == ny-nx || prey + prex == ny + nx)//在同一列、一个对角线 不合法
18 isOk = false;
19 }
20 if (isOk)
21 {
22 Queen[k] = i;//k个皇后在k行i列
23 ans += dfs(k+1);
24 }
25 }
26 return ans;
27 }
28 int main()
29 {
30 while(scanf ("%d",&n)&&n!=0)
31 {
32 //缩短时间
33 if (dp[n]==0)
34 dp[n]=dfs(1);
35 printf ("%d\n",dp[n]);
36 }
37 return 0;
38 }