C++解决八皇后问题(深度优先搜索)

代码

#include <iostream>
using namespace std;
int a[9][9], num = 0;
int b[9], c[17], d[17];
void dfs(int line) {
    if (line == 9) {
        for (int i = 1; i <= 8; i ++) {
            for (int j = 1; j <= 8; j ++) {
                cout << a[i][j] << " ";
            }
            cout << endl;
        }
        cout << "---------------" << endl;
        num ++;
        return;
    }
    for (int i = 1; i <= 8; i ++) {
        if (b[i] || c[line - i + 8] || d[line + i]) continue;
        b[i] = c[line - i + 8] = d[line + i] = 1;
        a[line][i] = 1;
        dfs(line + 1);
        a[line][i] = 0;
        b[i] = c[line - i + 8] = d[line + i] = 0;
    }
}
int main() {
    dfs(1);
    cout << "There are " << num << " solutions to the Eight Queens problem";
    return 0;
}

讲解

一般来说,大家想到的一般都是枚举法。

对,就是要套八个for循环的那个。

八皇后问题一共有92种解,枚举法要计算1677216次的运算。

效率非常的低,所以不能用这种方法。

要使用深度优先搜索来完成。

深度优先搜索一般不用check函数,都是用列表来保存的。

b数组表示的是列方面的判断。

c和d都是斜线。

至于c和d的偏移值是因为数组下标不能是负数。

做完这些后就基本上就可以了。

dfs

如果在第九行,那么输出值。

遍历格子一到格子八。

如果在数组内,不符合要求,下一次遍历。

否则,添加到数组。

进行下一层的dfs。

把数组中的元素删除。

结尾

好了,这就是八皇后问题的主体,byebye~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值