棋盘问题:数独与N皇后等。   leetcode:77
 
   
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void bt(int n,int k,int index){
  if(path.size()==k){
      result.push_back(path);
      return;
  }
  for(int i=index;i<=n;i++){
      path.push_back(i);
      bt(n,k,i+1);
      path.pop_back();
  }
}
vector<vector<int>> combine(int n, int k) {
  result.clear();
  path.clear();
  bt(n,k,1);
  return result;
}
};
leetcode:215
 
   
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void bt(int sum,int index,int k,int n){
  if(sum>n) return;
  if(sum==n&&path.size()==k){
      result.push_back(path);
      return;
  }
  for(int i=index;i<=9;i++){
      path.push_back(i);
      bt(sum+i,i+1,k,n);
      path.pop_back();
  }
}
vector<vector<int>> combinationSum3(int k, int n) {
  result.clear();
  path.clear();
  bt(0,1,k,n);
  return result;
}
};
leetcode:17
 
   
class Solution {
public:
vector<string>path;
string temp;
string mz[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
void bt(string digits,int num,int n){
  if(num==n){
      path.push_back(temp);
      return;
  }
  int number=digits[num]-'0';
  for(int i=0;i<mz[number].size();i++){
      temp.push_back(mz[number][i]);
      bt(digits,num+1,n);
      temp.pop_back();
  }
}
vector<string> letterCombinations(string digits) {
  if(digits.size()==0) return path;
  bt(digits,0,digits.size());
  return path;
}
};
leetcode:39
 
   
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void bt(vector<int> candidates, int target,int sum,int index){
  if(sum>target) return;
  if(sum==target){
      result.push_back(path);
      return;
  }
  for(int i=index;i<candidates.size();i++){
      path.push_back(candidates[i]);
      bt(candidates,target,sum+candidates[i],i);
      path.pop_back();
  }
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
  result.clear();
  path.clear();
  bt(candidates,target,0,0);
  return result;
}
};
leetcode:40
 
   
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void bt(vector<int> candidates, int target,int sum,int index){
  if(sum>target) return;
  if(sum==target){
      result.push_back(path);
      return;
  }
  for(int i=index;i<candidates.size();i++){
      if(i>index&&candidates[i]==candidates[i-1]) continue;
      path.push_back(candidates[i]);
      bt(candidates,target,sum+candidates[i],i+1);
      path.pop_back();
  }
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
  result.clear();
  path.clear();
  sort(candidates.begin(),candidates.end());
  bt(candidates,target,0,0);
  return result;
}
};
leetcode:113
 
   
class Solution {
public:
vector<vector<string>>result;
vector<string>path;
void bt(string s,int index){
  if(s.size()<=index) {
      result.push_back(path);
      return;
  }
  for(int i=index;i<s.size();i++){
      if(isPar(s,index,i)){
          string str = s.substr(index,i-index+1);
          path.push_back(str);
      }else continue;
      bt(s,i+1);
      path.pop_back();
  }
}
bool isPar(string s,int left,int right){
  for(int i=left,j=right;i<j;i++,j--){
      if(s[i]!=s[j]){
          return false;
      }
  }
  return true;
}
vector<vector<string>> partition(string s) {
  bt(s,0);
  return result;
}
};
leetcode:93
 
   
class Solution {
public:
vector<string>path;
void bt(string &s,int index,int num){
  if(num==3){
      if(isValid(s,index,s.size()-1)){
          path.push_back(s);
      }
      return;
  }
  for(int i=index;i<s.size();i++){
      if(isValid(s,index,i)){
          s.insert(s.begin()+i+1,'.');
          bt(s,i+2,num+1);
          s.erase(s.begin()+i+1);
      }else break;
  }
}
bool isValid(string s,int st,int ed){
  if(st>ed) return false;
  if(s[st]=='0'&&st!=ed){
      return false;
  }
  int num=0;
  for(int i=st;i<=ed;i++){
      if(s[i]>'9'||s[i]<'0') return false;
      num=num*10+(s[i]-'0');
      if(num>255) return false;
  }
  return true;
}
vector<string> restoreIpAddresses(string s) {
  if(s.size()>12) return path;
  bt(s,0,0);
  return path;
}
};
leetcode:78
 
   
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void bt(vector<int>& nums,int index){
  result.push_back(path);
  if(index>=nums.size()) return;
  for(int i=index;i<nums.size();i++){
      path.push_back(nums[i]);
      bt(nums,i+1);
      path.pop_back();
  }
}
vector<vector<int>> subsets(vector<int>& nums) {
  result.clear();
  path.clear();
  bt(nums,0);
  return result;
}
};
leetcode:90
 
   
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void bt(vector<int>& nums,int index){
  result.push_back(path);
  if(index>=nums.size()) return;
  for(int i=index;i<nums.size();i++){
      if(i>index&&nums[i]==nums[i-1]) continue;
      path.push_back(nums[i]);
      bt(nums,i+1);
      path.pop_back();
  }
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
  result.clear();
  path.clear();
  sort(nums.begin(),nums.end());
  bt(nums,0);
  return result;
}
};
leetcode:491
 
   
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
void bt(vector<int>& nums,int index){
  if(path.size()>=2){
      result.push_back(path);
  }
  int used[201]={0};
  for(int i=index;i<nums.size();i++){
      if((!path.empty()&&nums[i]<path.back())||used[nums[i]+100]==1) 
          continue;
      used[nums[i]+100]=1;
      path.push_back(nums[i]);
      bt(nums,i+1);
      path.pop_back();
  }
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
  result.clear();
  path.clear();
  bt(nums,0);
  return result;
}
};
leetcode:46
 
   
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
bool vis[100]={false};
void bt(vector<int>& nums){
  if(path.size()==nums.size()){
      result.push_back(path);
      return;
  }
  for(int i=0;i<nums.size();i++){
      if(vis[i]==true) continue;
      vis[i]=true;
      path.push_back(nums[i]);
      bt(nums);
      path.pop_back();
      vis[i]=false;
  }
}
vector<vector<int>> permute(vector<int>& nums) {
  result.clear();
  path.clear();
  bt(nums);
  return result;
}
};
leetcode:47
 
   
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
bool vis[100]={false};
void bt(vector<int>& nums){
  if(path.size()==nums.size()){
      result.push_back(path);
      return;
  }
  for(int i=0;i<nums.size();i++){
      if(vis[i]==true||(i>0&&nums[i]==nums[i-1]&&vis[i-1]==true)) continue;
      vis[i]=true;
      path.push_back(nums[i]);
      bt(nums);
      path.pop_back();
      vis[i]=false;
  }
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
  result.clear();
  path.clear();
  sort(nums.begin(),nums.end());
  bt(nums);
  return result;
}
};
leetcode:51
 
   
class Solution {
private:
vector<vector<string>> result;
// n 为输入的棋盘大小
// row 是当前递归到***的第几行了
void backtracking(int n, int row, vector<string>& chessboard) {
  if (row == n) {
      result.push_back(chessboard);
      return;
  }
  for (int col = 0; col < n; col++) {
      if (isValid(row, col, chessboard, n)) { // 验证合法就可以放
          chessboard[row][col] = 'Q'; // 放置皇后
          backtracking(n, row + 1, chessboard);
          chessboard[row][col] = '.'; // 回溯,撤销皇后
      }
  }
}
bool isValid(int row, int col, vector<string>& chessboard, int n) {
  int count = 0;
  // 检查列
  for (int i = 0; i < row; i++) { // 这是一个剪枝
      if (chessboard[i][col] == 'Q') {
          return false;
      }
  }
  // 检查 45度角是否有皇后
  for (int i = row - 1, j = col - 1; i >=0 && j >= 0; i--, j--) {
      if (chessboard[i][j] == 'Q') {
          return false;
      }
  }
  // 检查 135度角是否有皇后
  for(int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
      if (chessboard[i][j] == 'Q') {
          return false;
      }
  }
  return true;
}
public:
  vector<vector<string>> solveNQueens(int n) {
      result.clear();
      std::vector<std::string> chessboard(n, std::string(n, '.'));
      backtracking(n, 0, chessboard);
      return result;
  }
};
leetcode:37
 
   
class Solution {
public:
bool bt(vector<vector<char>>& board){
  for(int i=0;i<board.size();i++){
      for(int j=0;j<board[0].size();j++){
          if(board[i][j]!='.') continue;
          for(char k='1';k<='9';k++){
              if(isValid(i,j,k,board)){
                  board[i][j]=k;
                  if(bt(board)) return true;
                  board[i][j]='.';
              }
          }
          return false;
      }
  }
  return true;
}
bool isValid(int row,int col,char val,vector<vector<char>>& board)
{
  for(int i=0;i<9;i++){
      if(board[row][i]==val) return false;
  }
  for(int i=0;i<9;i++){
      if(board[i][col]==val) return false;
  }
  int startrow=(row/3)*3;
  int startcol=(col/3)*3;
  for(int i=startrow;i<startrow+3;i++){
      for(int j=startcol;j<startcol+3;j++){
          if(board[i][j]==val) return false;
      }
  }
  return true;
}
void solveSudoku(vector<vector<char>>& board) {
  bt(board);
}
};
技巧