在 4 × 4 的方格棋盘上放置4个皇后,使得没有两个
皇后在同一行、同一列、也不在同一条45度的斜线上.问有多
少种可能的布局?
经过手算我们很容易的出两种,而且也很容易想到DFS,那我们应该怎么做呢
```cpp
#include<bits/stdc++.h>
using namespace std;
bool tu[5][5];
bool d[5];
bool xie1[8];
bool xie2[8];
int cot=0;
void f(int r)
{
if(r==5)//如果等于五说明递归到了最后一层
{
cot++;
return;
}
for(int i=1;i<5;i++)//以行为遍历条件
{
if(!xie1[i+r-1]&&!xie2[3-i+r]&&!d[i])
{
xie1[i+r-1]=1;//就行横纵坐标一样,一个点的斜坐标也是独一无二的。
xie2[3-i+r]=1;
d[i]=1;
f(r+1);
d[i]=0;
xie1[i+r-1]=0;
xie2[3-i+r]=0;//重现现场
}
}
}
int main()
{
f(1);
cout<<cot;
}
横纵坐标的映射很简单 x=X,y=Y。所以让点不在同行或列就是是xi!=X或yi!=Y。斜坐标也是一样的,只是映射不一样,比如
这个点的映射就算x=r+i-1;但这是白线方向的斜法,同样还有垂直于白线方向的斜法,这时我们可以从右往左数y=4-i+r-1=3-i+r;其实相当于把棋盘旋转后的x和y映射,这样我们就掌握了所有的限制条件,可以为算法剪枝而且可以不必把所有的点位都判断一遍