本文共 1015 字,大约阅读时间需要 3 分钟。
题目链接:
题目描述:
输入: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/