八皇后问题 DFS

                              八皇后问题

 古老而且典型的回溯问题 , 八皇后问题:  找了采用深度优先 进行实现 :

  思路: 
一、首先 需要 一个判断该位置能不能放的问题: 
1、一个同一行 肯定不能放  并且  mat[i][col] 问题了
2、左斜向上的部分肯定不能放 ,因为这里是从0 行开始的(先卡第一行 在看第二行)要是左斜向上 有皇后 那么这个位置不能放 mat[row-1][col-1] 问题
 3、因为这里是 好吧 这个图: 不知道能不能贴出。。。。 因此右向上也不能放 这个就是 mat[row-1][col+ 1]问题了

二、就是dfs() 函数了
     这里的DFS是用 递归实现的 对于递归实现 那么就有几个药注意的问题了:
1、 第一出递归条件, 这里采用的是if(k >= 8) 出递归 因为这里K表示的是行 , 因此当运行到第八行是就全部结束了, 也就出递归了 
 2、其次就是, 在循环里 这里是列循环。。。满足放置条件那么放置 mat[k][i] = 1: dfs(k+1) 继续往下搜 mat[k][i] = 0 回溯
三、 就是解决问题的函数  solve()
1、初始化过程 
2 、 就是DFS ;然后也就差不多了。。。
下面给出其中一个实例: 

下面是代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

class EightQueen
{
public:
     void solve();
private:
    const static int Size = 8;
    int scnt;
    int mat[Size][Size];
    bool check(int,int);
    void dfs(int);
    void output();
};
//下面就写出个函数即可

bool  EightQueen::check(int row , int col)
{
    for(int i = 0 ; i < 8 ; i++)
    {
        if(mat[i][col])  return false;//表示这一行任何一个地方有皇后 那么这个位置不能放
    }
    for(int i = 0; row- i >=0 && col - i>= 0 ; i++)
    {
        //表示的是那个一斜行左上部分 有皇后 那么不能放
        if(mat[row-i][col-i]) return false;
    }
    for(int i = 0 ;col + i < 8 &&  row - i >= 0 ;i++)
    {
        if(mat[row-i][col+i]) return false;
    }
    //其他情况 可以放置
    return true;

}
void EightQueen::output()
{//输出各种搜索后的结果即 1 表示皇后放置的位置
    printf("Solution %d:\n", ++scnt);
    for(int i = 0 ; i < 8 ; i++)
    {
        for(int j = 0 ; j < 8 ;j++)
        {
            printf("%d ", mat[i][j]);
        }
        putchar('\n'); //换行
    }
}
void EightQueen::dfs(int k)
{
    if(k >= 8)
    {
        output();
        return ;//这里要用递归取写因此要写出出递归的条件
    }
    for(int i = 0 ; i <8; i++)
    {
       if(check(k, i))
       {//为什么需要回溯呢,因为dfs主要是因为一直往下搜索, 搜不到再回溯找到顶点然后往其他方向搜索
           mat[k][i] = 1;
           dfs(k+1);
           mat[k][i] = 0;//这个目的你是为了方便回溯
       }
    }
}
void EightQueen::solve()
{
    memset(mat, 0 ,sizeof(mat)); //棋盘进行初始化过程
    scnt = 0;
    dfs(0);

}
//下面需要一个类的对象
EightQueen one;
int main()
{
    //主函数里面调用即可
    one.solve();
    return 0;
}





wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
©️2020 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值