題目描述 Description
在n×n格的棋盤上放置彼此不受攻擊的n個皇后。按照國際象棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於再n×n的棋盤上放置n個皇后,任何2個皇后不妨在同一行或同一列或同一斜線上。
輸入描述 Input Description
給定棋盤的大小n (n ≤ 13)
輸出描述 Output Description
輸出整數表示有多少种放置方法。
樣例輸入 Sample Input
8
樣例輸出 Sample Output
92
數據範圍及提示 Data Size & Hint
n<=13
同N皇后。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=500+5;
int n,sum;
int a[maxn];
bool b[maxn],c[maxn],d[maxn];
void dfs(int i)
{
for(int j=1;j<=n;j++)
{
if(b[j]==0&&c[i+j]==0&&d[i-j+n]==0)
{
a[i]=j;
b[j]=1;
c[i+j]=1;
d[i-j+n]=1;
if(i==n) sum++;
else
dfs(i+1);
b[j]=0;
c[i+j]=0;
d[i-j+n]=0;
}
}
}
int main()
{
scanf("%d",&n);
dfs(1);
printf("%d\n",sum);
return 0;
}