【数据结构与算法】(十五)回溯算法
经典框架是递归+for循环,表示枚举所有的情况
LeetCode
1 N皇后 问题
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
class Solution { int *result; vector<vector<string>> ans; int count; public: vector<vector<string>> solveNQueens(int n) { result=new int[n]; count=n; cal8queens(0,n); return ans; } void cal8queens(int row,int num) { // 调用方式:cal8queens(0); if (row == num) { printQueens(result); return; // 8 行棋子都放好了,已经没法再往下递归了,所以就 return } for (int column = 0; column <count; ++column) { //递归中的for循环 是双杀 if (isOk(row, column)) { // 有些放法不满足要求 result[row] = column; // 第 row 行的棋子放到了 column 列 cal8queens(row+1,num); // 考察下一行 } } } bool isOk(int row, int column) { int leftup = column - 1, rightup = column + 1; for (int i = row-1; i >= 0; --i) { if (result[i] == column) return false; if (leftup >= 0) { if (result[i] == leftup) return false; } if (rightup < count) { if (result[i] == rightup) return false; } --leftup; ++rightup; } return true; } void printQueens(int result[]) { vector<string> solution; for (int row = 0; row < count; ++row) { string rowstring; for (int column = 0; column < count; ++column) { if (result[row] == column) rowstring+="Q"; else rowstring+="."; } solution.push_back(rowstring); } ans.push_back(solution); } };
2 正则表达式匹配
public: vector<vector<int>> memory; bool isMatch(string s, string p) { memory.resize(s.size() + 1); for (int i = 0; i <= s.size(); ++i) { memory[i] = vector<int>(p.size() + 1, -1); } return func(s, 0, p, 0) > 0; } int func( const string &s, int i, const string &p, int j ) { int& res = memory[i][j]; if(memory[i][j]!=-1) return memory[i][j]; if (i == s.size() && j == p.size()) { memory[i][j]=1; return 1; } if (j < p.size() && p[j + 1] == '*') { if (i == s.size()) { res=func(s, i, p, j + 2); } else if ((s[i] == p[j] || p[j] == '.') && (func(s, i + 1, p, j) || func(s, i + 1, p, j + 2))) { res=1; //return 1; } else { res=func(s, i, p, j + 2); } return res; } else if (i < s.size() && (s[i] == p[j] || p[j] == '.')) { res= func(s, i + 1, p, j + 1); return res; } res=0; return res; } };