#include
#include
#include
using namespace std;
const int maxn=100;
vector ans;
int cnt,N;
int sluction[maxn];
bool check(int row,int col)
{
for(int i=0;i<row;i++)
{
int j=sluction[i];
if(colj||i-jrow-col||i+j==row+col)
return false;
}
return true;
}
void DFS(int row)
{
if(row>=N)
{
cnt++;
return;//结束
}
for(int col=0;col<N;col++)
{
if(check(row,col)==false) continue;//剪枝
sluction[row]=col;
DFS(row+1);
}
}
int main()
{
N=8;
DFS(0);
cout<<cnt<<endl;
return 0;
}
第二种思路:
#include
int Queenes[8]={0},Counts=0;
int Check(int line,int list)
{
//遍历之前所有的行‘
for(int index=0,index<line;index++)
{
//挨个取出前面行皇后所在列的位置
int data=Queens[index];
//在同一列该位置就不能 放
if(list==data) return 0;
if((index-data==line-list)||(index+data==line+list))
return 0;
}
return 1;
}
void eight_queen(int line)
{
//在数组0-7列
for(int list=0;list<8;list++)
{
//对于固定的行列 检查是否和之前的皇后的位置有冲突
if(Check(line,list))
{
Queenes[line]=list;
if(line7)
{
count++;
//每次成功数组全部0
Queens[line]=0;
return;
}
//继续下一个皇后摆法
eight_queen(index+1);
//成功or失败 都要重归于0 以便重复使用
Queens[line]=0;
}
}
}
int main()
{
eight_queen(0);
cout<<count<<endl;
return 0;
}
void dfs(int line)
{
for(int line1=0;line1<8;line1++)
{
if(check(line,line1))
{
if(line17)
{
ans++;
return;
siluction[line1]={0};
}
dfs(index+1);
siluction[line]=0;//-------------------经典回溯
}
}