dfs--八皇后问题

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

 

 

因为我们要保证每个皇后不在同一个对角线,不在一行,不在一列

所以我们每次把第k个皇后放在第k行,即保证每个皇后都不在同一行

接下来我们要判断每个皇后是否在一列或者对角线即可

我们设一个queen数组表示每个皇后所放位置所在列

prey == ny || prey-prex == ny-nx || prey + prex == ny + nx

如果以上条件都不成立,那么皇后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 }

 

posted @ 2019-10-26 10:54  小又又  阅读(222)  评论(0编辑  收藏  举报