C++实现求解n皇后的问题(附力扣51n皇后的求解)

题目:

 代码讲解:

#include <iostream>
using namespace std;

const int N = 20;
char g[N][N];       //需要一个二维数组来表示棋盘
bool col[N], dg[N], udg[N];   //n*n棋盘的对角线数量时2n-1
int n;

void dfs(int u)    //传如的参数表述棋盘的行数
{
    //递归出口:当搜索的行数等于输入的行数时,输出棋盘,结束递归
    if(u == n) 
    {
        for(int i = 0; i < n; i++) puts(g[i]);
        puts("");
        return ;
    }
    
    //开始深搜:
    for(int i = 0; i < n; i++)  //i 表示列数
    {
        //深搜的条件
        //(u, i)    =>      (y, x);
        //正对角线:y = x + b,  反对角线:y = -x + b;
        //在对角线上,y+x / y-x 都等于一个常数,就是这条对角线上的截距,也就是说只要在同一条对角线上,那么他们的截距一定相等
        //而两条对角线上的截距分别可以表示成b = u + i / u - i;
        //为了保证截距为正数,可以将这条对角线往上平移,即加上一个n
        if(col[i] == false && dg[u + i] == false && udg[n + u - i] == false)
        {
            g[u][i] = 'Q';
            col[i] = dg[u + i] = udg[n + u - i] = true;
            
            //结束本行,搜索下一行
            dfs(u + 1);
            
            //恢复判断条件:
            col[i] = dg[u + i] = udg[n + u - i] = false;
            g[u][i] = '.'; 
        }
        
    }
    
    
}


int main()
{
    scanf("%d", &n);
    
    //初始化棋盘:
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++) g[i][j] = '.';
    }
    
    dfs(0);
    return 0;
}

关于深搜递归过程的理解:

那直接使用上面的代码模板来解决力扣上的n皇后问题吧

 非常简单:

class Solution {
public:
    vector<string> path;
    vector<bool> col, dg, udg;
    vector<vector<string>> ans;

    void dfs(int u, int n)
    {
        if(u == n) 
        {
            ans.push_back(path);
            return ;
        }
        for(int i = 0; i < n; i++)
        {
            if(col[i] == false && dg[i + u] == false && udg[u - i + n] == false)
            {
                path[u][i] = 'Q';
                col[i] = dg[i + u] = udg[u - i + n] = true;

                dfs(u + 1, n);
                col[i] = dg[i + u] = udg[u - i + n] = false;
                path[u][i] = '.';
            }
        }

    } 


    vector<vector<string>> solveNQueens(int n) 
    {
        path = vector<string>(n, string(n, '.'));
        col = vector<bool>(n);
        dg = udg =  vector<bool>(n * 2);

        dfs(0, n);
        return ans;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值