重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次:
方法1:逐行放置皇后,然后递归;
代码:
#include <bits/stdc++.h>
#define MAXN 8
#define ll long long
using namespace std;
ll ans=0;
int c[MAXN];
void dfs(int cur)
{
if(cur==MAXN) ans++; //***因为是逐行放置的,所以只要走到最后一行则肯定可行
else
{
for(int i=0; i<MAXN; i++) //***尝试在第cur行的第i列放置皇后
{
int flag=1;
c[cur]=i;
for(int j=0; j<cur; j++)
{
if(c[cur]==c[j]||c[cur]+cur==j+c[j]||c[cur]-cur==c[j]-j) //**判断皇后是否会相互攻击
{
flag=0;
break;
}
}
if(flag)
{
dfs(cur+1); //***如果合法,继续递归
}
}
}
}
int main(void)
{
dfs(0);
cout << ans << endl;
return 0;
}
方法2:思路和方法1差不多,区别是用二维数组vis[2][]来标记之前皇后的位置,判断是否会相互攻击
代码:
#include <bits/stdc++.h>
#define MAXN 8
#define ll long long
using namespace std;
ll ans=0;
int c[MAXN], vis[3][2*MAXN];
void dfs(int cur)
{
if(cur==MAXN) ans++; //***因为是逐行放置的,所以只要走到最后一行则肯定可行
else
{
for(int i=0; i<MAXN; i++)
{
if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+MAXN])
{
c[cur]=i; //***尝试将皇后放置在第cur行第i列
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+MAXN]=1; //**标记
dfs(cur+1); //**递归
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+MAXN]=0; //**去除标记
}
}
}
}
int main(void)
{
dfs(0);
cout << ans << endl;
return 0;
}