前言
首先这道深搜模板题让我想到了一个问题回溯算法和DFS(深度优先搜索)到底有什么区别?
题目链接
链接: P1219 [USACO1.5] 八皇后 Checker Challenge
题目描述
解题思路
回溯算法,也就是深度优先搜索加剪枝
代码实现
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=50;
int n,cnt=0;
int row[N];
int dg[N];
int udg[N];
int state[N];
void dfs(int x)
{
if(x==n+1){
cnt++;
if(cnt>3) return;
for(int i=1;i<=n;i++)
{
cout<<state[i]<<" ";
}
cout<<endl;
}
for(int i=1;i<=n;i++)
{
if(row[i]==0&&dg[i-x+n]==0&&udg[x+i]==0&&state[x]==0){
row[i]=1,dg[i-x+n]=1,udg[x+i]=1;
state[x]=i;
dfs(x+1);
row[i]=0,dg[i-x+n]=0,udg[x+i]=0;
state[x]=0;
}
}
}
int main()
{
cin>>n;
dfs(1);
cout<<cnt;
return 0;
}
总结
熟悉深搜的思想和步骤