八皇后问题-回溯算法

八皇后问题
(1)逐行放置,检测位置是否合法只需要检测是否同列,是否同对角线,是否同反对角线;
(2)采用一维数组保存皇后位置(record[i]的含义为第i行皇后所处位置为record[i]);
(3)对角线的斜率是1,反对角线的斜率为-1,若两个皇后的位置为(xi,yi)(xj,yj),则只需要|xi-xj| != |yi-yj| 且 yi != yj,位置便是合法的;

#include <iostream>
#include <cmath>
using namespace std;

int counter = 0;
int N = 8;
int record[8];//第i行的第record[i]列放置了一个皇后

void func(int curRow)
{
    if (curRow == N)
        counter++;
    else 
    for (int i = 0; i < N;i++)
    {
        bool isOk = true;
        record[curRow] = i;//尝试将第cur行的皇后放在第i列
        for (int j = 0; j < curRow; j++)//
        {
            if (record[curRow] == record[j] ||
                abs(curRow - j) == abs(record[curRow] - record[j]))
            {
                isOk = false;
                break;
            }       
        }
        if (isOk)//如果放置合法 那么进行下一行的放置
            func(curRow + 1);

    }

}
int main()
{
    func(0);
    cout << counter << endl;
    return 0;
}

欢迎大家批评指正~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值