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

59 篇文章 0 订阅
13 篇文章 0 订阅
这篇博客探讨了经典的N-Queens谜题,即如何在n×n棋盘上放置n个皇后,使它们互不攻击。博主介绍了利用深度优先搜索(DFS)和回溯法来解决此问题的思路,并提供了4-Queens问题的两个不同解决方案。在搜索过程中,需要检查当前列、左斜线和右斜线是否存在其他皇后,以确定当前位置是否适合放置皇后。若能成功到达第n层,即找到了一个解,并将其添加到结果集中。
摘要由CSDN通过智能技术生成

题目链接:https://leetcode.com/problems/n-queens/

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+回溯的问题. 每层搜索搜索枚举第i层的所有位置, 在决定这个位置是否可以放的时候我们需要看当前列是否有其他皇后, 当前位置的左斜线和右斜线是否有皇后, 如果有的话当前位置不能放, 都没有的话就可以放在这里, 并从当前位置进入下一次的搜索. 直到如果能够走到n层说明这是一个解, 就可以加入结果集合中.

代码如下:

class Solution {
public:
    void DFS(vector<string>& map, int k, int n)
    {
        if(n == k) return result.push_back(map);
        for(int i=0, y, x; i < n; i++)
        {
            for(y = 0; y < k; y++) 
                if(map[y][i] == 'Q') break;
            if(y != k) continue;
            for(x=i, y=k; x<n && y>=0; x++, y--)
                if(map[y][x] == 'Q') break;
            if(!(x==n || y<0)) continue;
            for(x=i, y=k;x>=0 && y>=0; x--, y--)
                if(map[y][x] == 'Q') break;
            if(!(x < 0 || y < 0)) continue;
            map[k][i] = 'Q';
            DFS(map, k+1, n);
            map[k][i] = '.';
        }
    }
    
    vector<vector<string>> solveNQueens(int n) {
        if(n<=0) return {};
        vector<string> map(n, string(n, '.'));
        DFS(map, 0, n);
        return result;
    }
private:    
    vector<vector<string>> result;
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值