首页 > 其他分享 >N皇后(回溯)

N皇后(回溯)

时间:2025-01-01 14:07:33浏览次数:1  
标签:... .. int chessboard 回溯 皇后 row

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

 

示例 1:

输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1
输出:[["Q"]]

 

 

class Solution {
public:
    vector<vector<string>> res;
    bool check(vector<string> &chessboard,int row,int col,int n){
        //检查列
        for(int i=0;i<row;i++){
            if(chessboard[i][col]=='Q'){
                return false;
            }
        }
        //检查45度角
        for(int i = row-1,j=col-1;i>=0&&j>=0;i--,j--){
            if(chessboard[i][j]=='Q'){
                return false;
            }
        }
        //检查135度角
        for(int i = row-1,j=col+1;i>=0&&j<n;i--,j++){
            if(chessboard[i][j]=='Q'){
                return false;
            }
        }
        return true;
    }
    void backtrack(vector<string> &chessboard,int row,int n){//按行填写皇后的位置
        if(row==n){
            res.push_back(chessboard);
            return;
        }
        for(int col=0;col<n;col++){
            if(check(chessboard,row,col,n)){
                chessboard[row][col]='Q';
                backtrack(chessboard,row+1,n);
                chessboard[row][col]='.';
            }
        }
    }
    vector<vector<string>> solveNQueens(int n) {
        vector<string> chessboard(n,string(n,'.'));//初始化棋盘
        backtrack(chessboard,0,n);
        return res;
    }
};

 

标签:...,..,int,chessboard,回溯,皇后,row
From: https://www.cnblogs.com/yueshengd/p/18645824

相关文章

  • 分割回文串(回溯)
    给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。示例1:输入:s="aab"输出:[["a","a","b"],["aa","b"]]示例2:输入:s="a"输出:[["a"]]classSolution{public:vector<vector......
  • 单词搜索(回溯)
    给定一个 mxn 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。......
  • 括号生成(回溯)
    数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例1:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]示例2:输入:n=1输出:["()"] classSolution{public://存储所有可能的有效括号组合的结果......
  • 组合总和(回溯)
    给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一......
  • 电话号码的字母组合(回溯)
    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。 示例1:输入:digits="23"输出:["ad","ae","af","bd","be","bf","cd","ce","cf&qu......
  • 穷举vs暴搜vs深搜vs回溯vs剪枝系列一>
    题目:  解析: 决策树:  代码设计:  代码: 写法一:path为全局变量privateintret,path,aim;publicintfindTargetSumWays(int[]nums,inttarget){aim=target;dfs(nums,0);returnret;}privatevoiddfs(i......
  • 子集(回溯)
    给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例1:输入:nums=[1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例2:输入:nums=[0]输出:[[],[0]] class......
  • 全排列(回溯)
    给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例1:输入:nums=[1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例2:输入:nums=[0,1]输出:[[0,1],[1,0]]示例3:输入:nums=[1]输出:[[1]]classSol......
  • n皇后问题
    我们首先从第一行开始放,然后对第一个皇后所在的这一行和这一列进行标记,再对四个角的地方进行标记,标记的就是接下来不能放的位置#include<iostream>usingnamespacestd;constintN=15;intans=0;intvis[N][N];//开一个棋盘数组,用来进行标记intn;voiddfs(intdep)/......
  • 【递归与回溯深度解析:经典题解精讲(下篇)】—— Leetcode
    文章目录有效的数独解数独单词搜索黄金矿工不同的路径|||有效的数独递归解法思路将每个数独的格子视为一个任务,依次检查每个格子是否合法。如果当前格子中的数字违反了数独规则(在行、列或3×3小方块中重复),直接返回False。递归检查下一个格子,直到所有格子都检......