棋盘问题
此题是一道经典的暴力搜素题目,类似于暴力搜素的经典题目“八皇后”
此题实际上是要枚举每一行皇后所在的位置,剔除不能放置皇后的位置,递归处理,即可完成。
那么废话不多说上代码
#include <bits/stdc++.h>
using namespace std;
const int N = 20;
int q[N];
bool col[N],dg[N * 2],udg[N * 2];
int n;
int sum = 0;
void dfs(int u)
{
if(u > n)
{
sum++;
if(sum <= 3)
{
for(int i = 1; i <= n; i++)
cout<<q[i]<<" ";
cout<<endl;
}
return;
}
for(int i = 1; i <= n; i ++)
if(!col[i] && !dg[u + i] && !udg[n - u + i])//剪枝(即去除不满足要求的点)
{
q[u] = i;
col[i] = dg[u + i] = udg[n - u + i] = true;
dfs(u + 1);
col[i] = dg[u + i] = udg[n - u + i] = false;//恢复现场;
q[u] = 0;
}
}
int main(){
cin>>n;
dfs(1);
cout<<sum<<endl;
return 0;
}
这里一定要注意恢复现场,为的是分支间互不影响,即每次操作间互不影响。