【数据结构与算法】(十五)回溯算法

经典框架是递归+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;
    }

};

  

 

  

 

posted @ 2019-08-30 19:33  xiaoxiaowenge  阅读(205)  评论(0编辑  收藏  举报