八皇后

在这里插入图片描述
#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(line1
7)
{
ans++;
return;
siluction[line1]={0};
}

    dfs(index+1);
    siluction[line]=0;//-------------------经典回溯
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值