写在前面
最开始接触回溯算法是八皇后问题,经典的N皇后问题,当时看了代码就觉得很神奇,但是理解不了为什么是这样的,当时在2n皇后python版一文里面写的题解是
2n皇后问题,解决这个先要知道n皇后问题的解法。下面我们先介绍一下n皇后问题。
n皇后问题是有nxn的棋盘,有n个皇后,皇后与皇后之间不能在同一行,同一列,以及对角线上。问皇后能有多少种排列方式(皇后都是一样的)。
我们采用两个函数,一个函数判断皇后在这个位置上是否合法(是否同行,是否同列,是否对角线)。
另一个函数用来深搜,搜到一条符合条件的路线,把路线加到一个列表。(我也说不清楚,可以debug代码,然后看到一步一步是怎么递归的)
当时就是说不清楚(虽然现在也未必能说的很清楚(笑哭)哈哈哈),接下来就从力扣上面找几个回溯的题目来整理一下回溯大法的神奇之处吧。
leetcode51 N皇后问题
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例 1:
输入:n = 4
输出:[[".Q…","…Q",“Q…”,"…Q."],["…Q.",“Q…”,"…Q",".Q…"]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1
输出:[[“Q”]]
提示:
1 <= n <= 9
皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-queens
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析:
相当于是 n ∗ n n*n n∗n的格子里面合理放置一种皇后,皇后之间不同行不同列不同对角线。
回溯算法的框架展示如下:
vector<vector<string>> res;
//回溯算法
void fun(路径,当前行)
{
if(当前行=n)//说明走到尽头了,且走到这了,就是前面n-1行都是符合要求的
{
res.push_back(路径);
return;
}
int n = 路径.size();//所有的列数
for(int col = 0;col<n;col++)//相当于在当前行遍历所有的列,就关注到当前行的每一个点了
{
if(valid(路径,row,col)//如果放在这个位置是合理的
路径[row][col] = 'Q';
fun(路径,row+1);//到下一行
路径[row][col] = '.';//从上一行递归到这里就说明,上一行后续有的点不可以,就还原
}
}
这样写起来是能够看懂的,但是还是建议第一次写的话去deb