leetcode--51N皇后

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
在这里插入图片描述
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

示例:

输入: 4
输出: [
[".Q..",  // 解法 1
 "...Q",
 "Q...",
 "..Q."],

["..Q.",  // 解法 2
 "Q...",
 "...Q",
 ".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-queens

方法:递归与回溯
这道题同样也是被一个小bug耽误了一个多小时,看来编程结束后,先要顺一遍逻辑,检查逻辑错误,我是在复制前面所写的代码时,前面代码改了,复制的忘改了,导致结果一直不正确。这是一个教训。
N皇后的问题,仔细思考。我们一行一行的放皇后,那么有三个约束条件,一个是列不能重复,两条对角线不能重复。其中两条对角线有规律,一条对角线行列之和相等(i+j),另一条是行减列加上n减1相等。(i-j+n-1)。对此我们设三个分别记录有没有被占用。
如果没有占用,我们把得到的一个列加入答案,然后将这三个都设置为true,然后进入下一次递归,直到不满总,我们需要恢复之前的状态。
递归的终止条件就是列的长度已经等于n,证明有一组解,然后进行生成结果的函数。结果函数很简单,先造一个n*n的矩阵,全放着’.’,然后遍历row,将Q放入即可。

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {        
        res.clear();
        col = vector<bool> (n, false);
        dia1 = vector<bool> (2*n - 1, false);
        dia2 = vector<bool> (2*n - 1, false);
        vector<int> row;
        putqueen( n, 0, row);
        return res;
    }

private:
    vector<vector<string>> res;
    vector<bool> col, dia1, dia2;
    
    vector<string> genetate( int n, vector<int> &row ){
        assert(row.size() == n);
        vector<string> board(n, string(n, '.'));
        for(int i = 0; i < n; i++)
            board[i][row[i]] = 'Q';
        return board;
    }
    // index代表在所在行
    void putqueen(int n, int index, vector<int> &row){
        if(index == n ){
            res.push_back(genetate(n,row));
            return;
        }
        for(int i = 0; i < n; i++){
            if( !col[i] && !dia1[index+i] && !dia2[ index-i+n-1] ){
                row.push_back(i);
                col[i] = true;
                dia1[index + i] = true;
                dia2[ index - i + n -1] = true;
                putqueen(n, index + 1, row);
                col[i] = false;
                dia1[index + i] = false;
                dia2[ index - i + n -1] = false;
                row.pop_back();
            }
        }
        return;
        
    }

};
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值