题目描述
题目直达
有一个 n \times n×n 的国际象棋棋盘(n 行 n 列的方格图),请在棋盘中摆放 n个受伤的国际象棋皇后,要求:
- 任何两个皇后不在同一行。
- 任何两个皇后不在同一列。
- 如果两个皇后在同一条 45 度角的斜线上,这两个皇后之间行号的差值至少为 3 。
请问一共有多少种摆放方案。
输入描述
输入的第一行包含一个整数 n。
其中,1≤n≤10。
输出描述
输出一个整数,表示答案。
输入
4
输出
2
代码:
#include<iostream>
using namespace std;
const int N=110;
int g[N];//存放的是这一行元素在那一列
int n,con;
bool vail(int row,int col)
{
for(int i=1;i<row;i++)//因为我们的行号是按顺序的,所以要判断的是该行上面的被放过的行
{
if(g[i]==col)return false;//如果上面行同列被放过
if(col-row==g[i]-i&&row-i<3)return false;//y=x+b,所以可以发现y-x=b,这条线上点的都满足此条件
if(col+row==g[i]+i&&row-i<3)return false;//y=-x+b,同理y+x=b
}
return true;
}
void bfs(int row)//row行号
{
if(row>n)//如果存满,就说明在条件满足的情况下,放好了,呢就是一种情况
{
con++;
return;
}
for(int i=1;i<=n;i++)//把每一行的所有列都看看,那个满足条件
{
if(vail(row,i))//如果可以满足三个条件
{
g[row]=i;//皇后被放到了row行的第i列
bfs(row+1);//遍历下一行
}
}
}
int main()
{
cin>>n;
bfs(1);//遍历行,这样就不用储存行号
cout<<con;
return 0;
}