原题链接
思路
1.dfs经典题N-皇后问题的变形,用全排列的方式来枚举,记录结果即可
2.我们可以发现,对于N*N的棋盘,正好放N个,每行一个,然后枚举每行放置的位置并记录
3.满足什么条件就可以放,就是列,两条斜对角线都没有棋子的情况,就可以放
4.因为要求所有的情况,所以每次记得还原
AC代码
#include <iostream>
using namespace std;
const int N = 15;
int n;
bool col[N], d[N * 2], ud[N * 2];
int ans, path[N];
void dfs(int x)
{
if (x > n)
{
ans ++ ;
if (ans <= 3)
{
for (int i = 1; i <= n; i ++ ) cout << path[i] << ' ';
cout << endl;
}
return;
}
for (int y = 1; y <= n; y ++ )
if (!col[y] && !d[x + y] && !ud[x - y + n])
{
col[y] = d[x + y] = ud[x - y + n] = true;
path[x] = y;
dfs(x + 1);
col[y] = d[x + y] = ud[x - y + n] = false;
}
}
int main()
{
cin >> n;
dfs(1);
cout << ans << endl;
return 0;
}