leetcode51

N皇后

N皇后问题要求同一行、同一列还有斜对角线不能同时出现两个及以上的皇后。

思路:满足题目的三个需求,需要对棋盘的深度进行递归,递归的过程中进行回溯,也就是撤销上一次的移动。

class Solution {
private:
    vector<vector<string>> ans;

    void slove(int n,int r, vector<string> &temp){
        if(r == n){
            ans.push_back(temp);
            return;
        }
        for(int c = 0;c<n;c++){
            if(isValid(n,r,c,temp)){
                temp[r][c] = 'Q';
                slove(n,r+1,temp);
                    //回溯
                temp[r][c] = '.';
            }
        }
    }

    bool isValid(int n,int r,int c,vector<string> &path){
       //检查同一列
        for(int i =0;i<r;i++){
            if(path[i][c] =='Q')
                return false;
        }

        //判断两条对角线
        for(int i = r-1,j=c-1;i>=0&&j>=0; i--,j--){
            if(path[i][j] == 'Q')
                return false;
        }

        for(int i =r-1,j=c+1;i>=0&&j<n;i--,j++){
            if(path[i][j] == 'Q')
                return false;
        }

        return true;
    }
public:
    vector<vector<string>> solveNQueens(int n) {
        ans.clear();
        vector<string> temp(n, string(n, '.'));
        slove(n,0,temp);
        return ans;
    }
};

看完之后,你是不是发现了代码中没有对棋盘的同一行进行判断,这是因为每一层递归只会选for循环 当前行 的一个元素。

LeetCode51 题 N-Queens 的 Python 法中,出现 `NameError: name 'backtracking' is not defined` 错误通常表明代码中调用了名为 `backtracking` 的函数或方法,但该函数并未在代码中定义或导入。从提供的引用来看,问题的决方案主要依赖于递归和回溯的思想来放置后,并在冲突检测后进行状态回退。 此类错误的常见原因包括: - 在代码中错误地引用了 `backtracking` 函数,但没有定义该函数或使用了错误的函数名。 - 代码结构混乱,例如将递归调用指向了未定义的 `backtracking` 而非实际的递归函数名,如 `NQueens`。 例如,引用中的代码定义了一个名为 `NQueens` 的递归函数来实现回溯逻辑[^1]。如果尝试将该函数调用改为 `backtracking` 但未重新定义该函数,则会导致 `NameError`。 ### 决方法 1. **检查函数名是否拼写错误**:确保所有调用与函数定义中的名称一致。例如,如果函数定义为 `NQueens`,则所有调用都应使用 `NQueens`。 2. **替换未定义的函数名**:如果试图使用 `backtracking` 作为函数名,请定义该函数或替换为已存在的函数名。 3. **确保函数作用域正确**:全局函数或嵌套函数需要在调用前定义,以避免释器无法识别该函数。 以下是一个修正后的示例代码,确保函数名一致性并避免 `NameError`: ```python def solveNQueens(n): def backtrack(row, positions, result, n): if row == n: result.append(positions[:]) return for col in range(n): if is_safe(positions, row, col): positions.append(col) backtrack(row + 1, positions, result, n) positions.pop() def is_safe(positions, row, col): for r in range(row): c = positions[r] if c == col or abs(c - col) == row - r: return False return True result = [] backtrack(0, [], result, n) return [["." * c + "Q" + "." * (n - c - 1) for c in solution] for solution in result] # 示例调用 print(solveNQueens(4)) ``` ### 调试建议 - 确保代码中没有对未定义的函数(如 `backtracking`)进行调用。 - 检查所有函数定义与调用是否一致。 - 使用调试工具或打印语句,逐步验证函数调用流程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值