文章标题 HDU 2553 : N皇后问题 (DFS)

来源:互联网 发布:新疆商务厅 数据分析 编辑:程序博客网 时间:2024/06/14 05:51

N皇后问题

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

Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10

题意:是中文的所以就不用多说了
分析:可以用DFS,用place【i】来表示第i行的皇后放在第place【i】列,然后判断如果index表示当前到达的行数,遍历所有的列,然后遍历已经放置的皇后的位置与当前的位置是否合理
(1)如果place【index】== place【j】说明在同一列不符合题意
(2)如果fabs(index-j)==fabs(i-place[j]),说明在同一斜线上,其中index-j表示两个皇后位置的行数的差值,index-place[j]表示两个皇后位置的列数的差值
代码:

#include<iostream>#include<string>#include<cstdio>#include<cstring>#include<vector>#include<math.h>#include<map>#include<queue> #include<algorithm>using namespace std;const int inf = 0x3f3f3f3f;int n;int place[11];//place[i]表示皇后放置在第i行的第place[i]列 int ans[11];//用来保存有i个皇后的答案的 void dfs(int index,int n,int &cnt){//index表示深度,n表示数目,cnt表示解法的数目     if (index>n){//如果大于n说明n个皇后已经放置好了解法+1         cnt++;        return;    }    int flag;    for (int i=1;i<=n;i++){//遍历所有的列         place[index]=i;//如果放在第i列         int flag=1;//判断是否符合位置         for (int j=1;j<index;j++){            //判断是否合理            //第一个判断是否在同一列,第二个是否在同一斜线上             if (place[j]==i||fabs(index-j)==fabs(i-place[j])){                flag=0;                break;            }        }        if (flag){//如果符合则判断下一行             dfs(index+1,n,cnt);        }    }}int main (){    //先初始化,不然会超时     for (int i=1;i<=10;i++){        int cnt=0;        dfs(1,i,cnt);        ans[i]=cnt;    }    while (cin>>n){        if (n==0)break;        printf ("%d\n",ans[n]);    }           return 0;}
0 0
原创粉丝点击