F. n皇后问题
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
在 N×NN×N 的方格棋盘放置了 NN 个皇后,使得它们不相互攻击(即任意 2 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 45 角的斜线上。
你的任务是,对于给定的 NN,求出有多少种合法的放置方法。
Input
输入一个正整数 nn, nn 代表棋盘和皇后的数量 (0<n<11)(0<n<11)
Output
输出一个整数,代表共有多少种合法的放置方案数
Example
input
Copy
4
output
Copy
2
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int s[15];//列号
int n,sum=0;
int ok(int m)
{
for(int i=1;i<m;i++)
{
if(abs(m-i)==abs(s[m]-s[i]) || s[m]==s[i])
return 0; //对角线或同列
}
return 1;
}
void solve(int t)
{
if(t<=n)
{
for(int i=1;i<=n;i++)
{
s[t]=i; //第t个皇后放在i列
if(ok(t)) //可以放
solve(t+1); //下一个皇后
}
}
else
sum++;
}
int main()
{
cin>>n;
if(n==0)
cout<<0<<endl;
else
{
solve(1);
cout<<sum<<endl;
}
return 0;
}