回溯法是一种组织搜索的一般技术,有“通用的解题法”之称,用它可以系统的搜索一个问题的所有解或任一解。
有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法。
可以系统地搜索一个问题的所有解或任意解,既有系统性又有跳跃性。
回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。
这种以深度优先的方式系统地搜索问题的解的方法称为回溯法。
2n皇后问题
#include<bits/stdc++.h>
using namespace std;
int chess[9][9] = {0};
int n=0;
int num=0;
bool check(int curR,int pos[])
{
for(int i=1;i<curR;i++)
{
if(pos[curR]==pos[i]||(abs(curR-i)==abs(pos[curR]-pos[i])))
return false;
}
return true;
}
void dfs(int curR,int posB[],int posW[]) //放一种皇后
{
if(curR == n+1)
{
num++;
return ;
}
for(int i=1;i<=n;i++)
{
if(posB[curR]==i)
continue;
if(chess[curR][i]==0)
continue;
posW[curR] = i;
if(check(curR, posW)==true)
{
dfs(curR+1, posB, posW);
}
}
}
void dfs1(int curR,int posB[],int posW[]) //放另一种皇后
{
if(curR>n)
{
dfs(1,posB,posW);
return ;
}
for(int i=1;i<=n;i++)
{
if(chess[curR][i]==0)
continue;
posB[curR] = i;
if(check(curR, posB)==true)
{
dfs1(curR+1,posB,posW);
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cin>>chess[i][j];
}
int posB[15] = {0};
int posW[15] = {0};
dfs1(1, posB, posW);
cout<<num;
return 0;
}