题目描述
有一个 n×n 的国际象棋棋盘(n 行 n 列的方格图),请在棋盘中摆放 n 个受伤的国际象棋皇后,要求:
- 任何两个皇后不在同一行。
- 任何两个皇后不在同一列。
- 如果两个皇后在同一条 45 度角的斜线上,这两个皇后之间行号的差值至少为 3 。
请问一共有多少种摆放方案。
输入描述
输入的第一行包含一个整数 n。
其中,1≤n≤10。
输出描述
输出一个整数,表示答案。
输入输出样例
示例 1
输入
4
输出
2
【思路及代码】
*与n皇后的思路一致,n皇后问题对对角线的考虑只是是否在同一对角线上,而本题提出两个皇后的行数差值大于等于3的时候可以在同一对角线上。将n皇后中对于对角线的标记由简单的true,false变为标记最后放置的行号,如果差值大于等于3或者当前对角线没有被放置过就可以放置。
#include<bits/stdc++.h>
using namespace std;
const int N=50;
int c[N],dg[N],rdg[N],n,ans;
//列、主对角线、副对角线
void dfs(int x)
{
if(x==n+1)
{
ans++;
return;
}
for(int i=1;i<=n;i++)
{
if(!c[i]&&(x-dg[x+i]>=3||!dg[x+i])&&(x-rdg[n-x+i]>=3||!rdg[n-x+i]))
{
c[i]=1;
dg[x+i]=x;
rdg[n-x+i]=x;
dfs(x+1);
c[i]=0;
dg[x+i]=0;
rdg[n-x+i]=0;
}
}
}
int main()
{
cin>>n;
dfs(1);
cout<<ans;
return 0;
}