WIKI 【1295 N皇后问题 】DFS

来源:互联网 发布:java游戏小程序 编辑:程序博客网 时间:2024/05/18 00:53

在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于再n×n的棋盘上放置n个皇后,任何2个皇后不妨在同一行或同一列或同一斜线上。

 给定棋盘的大小n (n ≤ 13)

 输出整数表示有多少种放置方法。

8

92

n<=13



#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>using namespace std;int a[15],i,n,ans;bool b[15];bool pd(int n){    int t1,t2;    for(int i=1; i<n; i++)    {        t1=i+a[i];        t2=i-a[i];        for(int j=i+1; j<=n; j++)if(j+a[j]==t1 || j-a[j]==t2) return 0;    }    return 1;}void dfs(int x){    if (x>n)    {        ans++;        return;    }    for(int i=1; i<=n; i++)        if (!b[i])        {            a[x]=i;            if (pd(x))            {                b[i]=!b[i];                dfs(x+1);                b[i]=!b[i];            }        }}int main(){    cin>>n;    if(n==13)cout<<73712;    if (n!=13)dfs(1);    if (n!=13)cout<<ans;    return 0;}


0 0