求解八皇后问题

八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当n = 1或n ≥ 4时问题有解。(问题描述来自参考文献1)

思想我用的是搜索(本人大一,菜鸟一枚,呜呜呜)

上代码了,老北鼻们

#include<bits/stdc++.h>
using namespace std;
int ans=0;//答案总数
//     列    第一条斜线   第二条斜线
bool col[10], x1[20],    x2[20];  //初始化是false
/*前说一下我对这两个斜线的理解,其实对于棋盘的某条斜线的点而言x+y其实和是定值*/
bool check(int r,int i)  //  排查是否符合列和斜线是否符合唯一的规则
{
    return !col[i]&&!x1[r+i]&&!x2[r-i+8];
}
void dfs(int r)// r:列
{
    if(r==8)
    {
        ans++;
        return ;
    }
    /*此处再谈一下我都理解,r是列那么for遍历的就是r列的每一行*/
    for(int i=0; i<8; i++)
    {
        if(check(r,i)) //查看是否符合规则
        {
            col[i]=x1[r+i]=x2[r-i+8]=true;
            dfs(r+1);
            col[i]=x1[r+i]=x2[r-i+8]=false;
        }
    }
}
int main()
{
    dfs(0);
    cout<<ans<<endl;
    return 0;
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

活在当下 北乔

不爱多bb,朴实一句话:感谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值