博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetCode 51 N皇后(dfs,回溯)
阅读量:251 次
发布时间:2019-03-01

本文共 1015 字,大约阅读时间需要 3 分钟。

题目链接:

题目描述:

给定一个大小为
n
的正方形国际象棋棋盘,求有多少种方式可以放置
n
个皇后并使得她们互不攻击,即每一行、列、左斜、右斜最多只有一个皇后。
 
输入输出:
 
输入:n = 4输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
输入:n = 1输出:[["Q"]]

题目分析:

这是一道运用回溯法的典型题。类似于在矩阵中寻找字符串,本题也是通过修改状态矩阵来进行回溯。不同的是,我们需要对每一行、列、左斜、右斜建立访问数组,来记录它们是否存在皇后。本题有一个隐藏的条件,即满足条件的结果中

每一行或列有且仅有一个皇后这是因为我们一共只有 n 行和 n 列。所以如果我们通过对每一行遍历来插入皇后,我们就不需要对行建立访问数组了。关于对角线数组,因为对角线有两种方向,即“\”和“/” ,故需要建立两个对角线数组,每个数

组大小为2*n-1,对于“/”方向对角线“row+column”即表示当前所在对角线的索引,而对于“\”方向对角线,“n-row+column+1”表示当前所在该方向对角线的索引。

代码:

 

vector
>solveNQueens(int n){ vector
>ans; if(n==0) { return ans; } vector
board(n,string(n,'.')); vector
column(n,false),ldiag(2*n-1,false),rdiag(2*n-1,false);//ldiag表示斜向右下的对角线,rdiag表示斜向左上的对角线,每种方向的对角线均有2*n-1条 backtracking(ans,board,column,ldiag,rdiag,0,n); return ans;} void backtracking(vector
>&ans,vector
&board,vector
&column,vector
&ldiag,vector
&rdiag,int row,int n){ if(row==n)//如果行数达到要求则递归结束 { ans.push_back(board); return ; } for(int i=0;i

 

转载地址:http://yxlx.baihongyu.com/

你可能感兴趣的文章