//首先我们要理清限制条件
//皇后所在行列不能有重复皇后,且其对角线也不能
#include<bits/stdc++.h>
using namespace std;
int n, ans;
const int N = 15;
int vis[N][N];
void dfs(int dep)
{
//如果dep==n+1,说明此放置方法合理
if(dep == n+1)
{
ans++;
return;
}
for (int i = 1; i <= n; i++)
{
if (vis[dep][i]) continue;
//根据dep可以判断每行只会放置1个皇后
//所以只需要把每列和对角线排除
for (int _i = 1; _i <= n; _i++) vis[_i][i]++;
for (int _i = dep,_j = i; _i >= 1 & _j <= n; --_i,++_j) vis[_i][_j]++;
for (int _i = dep,_j = i; _i <= n & _j >= 1; ++_i,--_j) vis[_i][_j]++;
for (int _i = dep,_j = i; _i >= 1 & _j >= 1; --_i,--_j) vis[_i][_j]++;
for (int _i = dep,_j = i; _i <= n & _j <= n; ++_i,++_j) vis[_i][_j]++;
dfs(dep+1);
//恢复
for (int _i = 1; _i <= n; _i++) vis[_i][i]--;
for (int _i = dep,_j = i; _i >= 1 & _j <= n; --_i,++_j) vis[_i][_j]--;
for (int _i = dep,_j = i; _i <= n & _j >= 1; ++_i,--_j) vis[_i][_j]--;
for (int _i = dep,_j = i; _i >= 1 & _j >= 1; --_i,--_j) vis[_i][_j]--;
for (int _i = dep,_j = i; _i <= n & _j <= n; ++_i,++_j) vis[_i][_j]--;
}
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin >> n;
dfs(1);
cout << ans << '\n';
return 0;
}
*蓝桥OJ 1508N皇后问题 DFS
最新推荐文章于 2024-05-21 23:16:53 发布