[Leetcode] 51. N-Queens 解题报告

本文介绍了一种使用回溯法解决N皇后问题的有效方法。通过详细的代码示例展示了如何检查每一层的安全性,并确保放置的皇后不会互相攻击。最终返回所有可能的棋盘配置。

题目

The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

Given an integer n, return all distinct solutions to the n-queens puzzle.

Each solution contains a distinct board configuration of the n-queens' placement, where 'Q' and '.' both indicate a queen and an empty space respectively.

For example,
There exist two distinct solutions to the 4-queens puzzle:

[
 [".Q..",  // Solution 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // Solution 2
  "Q...",
  "...Q",
  ".Q.."]
]

思路

经典的“八皇后问题”简直就是为回溯法而生。为了提高运行效率,我们在DFS的内部实现了安全性检查:即在搜索进行到第k层的第i个位置时,我们检查它所在的列是否安全;所在的对角线是否安全,以及所在的反对角线是否安全。如果这三个地方都是安全的,则试图在该位置放置一个皇后,然后接着搜索下一层。搜索完成之后一定要回溯,才能保证找到所有满足条件的解。

代码

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        vector<vector<string>> ret;
        if(n <= 0) 
            return ret;
        vector<string> map(n, string(n, '.'));  // initialize the chess
        DFS(map, ret, 0, n);  
        return ret;
    }
private:
    void DFS(vector<string>& map, vector<vector<string>> &ret, int k, int n)  
    {  
        if(n == k) 
            return ret.push_back(map);  
        for(int i = 0; i < n; ++i)  
        {
            int x, y;
            for(y = 0; y < k; y++)               
                if(map[y][i] == 'Q')    // the y-th row is not safe
                    break;  
            if(y != k)
                continue;  
            for(x = i, y = k; x < n && y >= 0; x++, y--)  
                if(map[y][x] == 'Q')    // the counter-diagonal is not safe
                    break;  
            if(!(x == n || y < 0))
                continue;  
            for(x = i, y = k;x >= 0 && y >= 0; x--, y--)  
                if(map[y][x] == 'Q')    // the diagonal is not safe 
                    break;  
            if(!(x < 0 || y < 0))
                continue;  
            map[k][i] = 'Q';  
            DFS(map, ret, k + 1, n);  
            map[k][i] = '.';            // backtracking
        }  
    }
};


内容概要:本文介绍了一个基于Matlab的综合能源系统优化调度仿真资源,重点实现了含光热电站、有机朗肯循环(ORC)和电含光热电站、有机有机朗肯循环、P2G的综合能源优化调度(Matlab代码实现)转气(P2G)技术的冷、热、电多能互补系统的优化调度模型。该模型充分考虑多种能源形式的协同转换与利用,通过Matlab代码构建系统架构、设定约束条件并求解优化目标,旨在提升综合能源系统的运行效率与经济性,同时兼顾灵活性供需不确定性下的储能优化配置问题。文中还提到了相关仿真技术支持,如YALMIP工具包的应用,适用于复杂能源系统的建模与求解。; 适合人群:具备一定Matlab编程基础和能源系统背景知识的科研人员、研究生及工程技术人员,尤其适合从事综合能源系统、可再生能源利用、电力系统优化等方向的研究者。; 使用场景及目标:①研究含光热、ORC和P2G的多能系统协调调度机制;②开展考虑不确定性的储能优化配置与经济调度仿真;③学习Matlab在能源系统优化中的建模与求解方法,复现高水平论文(如EI期刊)中的算法案例。; 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码和案例文件,按照目录顺序逐步学习,重点关注模型构建逻辑、约束设置与求解器调用方式,并通过修改参数进行仿真实验,加深对综合能源系统优化调度的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值