//八皇后——递归回溯
//采用全排序(n!)
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int maxn = 50;
int dic[maxn][maxn] = { 0 }, c[10] = { 0 };
//dic记录是否访问过,c【i】=x则是记录第i行是在第几列;
int ans, n;//ans是记录有多少个解法;n是一共有几行(正方形);
void search(int cur) //从0行开始
{
if (cur == n) //某一种解法完成了则ans+1;
{
ans++; return;//多了一个return返回清空
}
else
{
for (int i = 0; i < n; i++) //枚举所有列;
{//判断当前位置是否可以放置,分别是列,副对角线,主对角线
if (!dic[0][i] && !dic[1][cur + i] && !dic[2][cur - i + n])//小细节这里决定了maxn需要是n的两倍+1以上
{
c[cur] = i;
dic[0][i] = dic[1][cur + i] = dic[2][cur - i + n] = 1;//标志已经走过
search(cur + 1);//开始下一行
dic[0][i] = dic[1][cur + i] = dic[2][cur - i + n] = 0;//非常重要,回溯还原;与上面的return相互照应,清空已经成功走过的路线
}
}
}
}
int main()
{
cin >> n;
memset(dic, 0, sizeof(dic));
ans = 0;
search(0);
cout << ans;
return 0;
}
小白系列——递归回溯(详细注释)
最新推荐文章于 2025-04-09 14:15:04 发布