int total =0;int val =0;voiddfs(vector<int>& nums,int step =0){total += val;for(int i = step; i < nums.size();++i){val ^= nums[i];dfs(nums, i +1);val ^= nums[i];}}intsubsetXORSum(vector<int>& nums){dfs(nums,0);return total;}
int ret =0;voiddfs(int n,int step, vector<bool>& check){if(step > n) ret +=1;for(int i =1; i <= n;++i){if(check[i]==false){if(i % step ==0|| step % i ==0){check[i]=true;dfs(n, step +1, check);check[i]=false;}}}}intcountArrangement(int n){vector<bool>check(n +1,false);dfs(n,1, check);return ret;}
vector<vector<bool>>* row =newvector<vector<bool>>(10,vector<bool>(10,false));
vector<vector<bool>>* col =newvector<vector<bool>>(10,vector<bool>(10,false));
vector<vector<vector<bool>>>* check =new vector<vector<vector<bool>>>(3,vector<vector<bool>>(3,vector<bool>(10,false)));booldfs(vector<vector<char>>& board){for(int i =0; i <9;++i){for(int j =0; j <9;++j){if(board[i][j]=='.'){for(int n =1; n <=9;++n){if(!(*row)[i][n]&&!(*col)[j][n]&&!(*check)[i/3][j/3][n]){board[i][j]='0'+ n;(*row)[i][n]=(*col)[j][n]=(*check)[i /3][j /3][n]=true;if(dfs(board)==true)returntrue;board[i][j]='.';(*row)[i][n]=(*col)[j][n]=(*check)[i /3][j /3][n]=false;}}returnfalse;}}}returntrue;}voidsolveSudoku(vector<vector<char>>& board){for(int i =0; i <9;++i){for(int j =0; j <9;++j){if(board[i][j]!='.'){int num = board[i][j]-'0';(*row)[i][num]=(*col)[j][num]=(*check)[i /3][j /3][num]=true;}}}dfs(board);delete row;delete col;delete check;}
单词搜索
unordered_multimap<int,int> direction ={{0,1},{0,-1},{1,0},{-1,0}};// 循环 - 方式booldfs(vector<vector<char>>& board, string& word, vector<vector<bool>>& visit,int i,int j,int step){if(step == word.size())returntrue;for(auto& e : direction){int x = i + e.first, y = j + e.second;if((x >=0&& x < board.size())&&(y >=0&& y < board[0].size())&&(visit[x][y]==false)&&(board[x][y]== word[step])){visit[x][y]=true;if(dfs(board, word, visit, x, y, step +1))returntrue;visit[x][y]=false;}}returnfalse;}// 分支 - 方式booldfs(vector<vector<char>>& board, string& word, vector<vector<bool>>& visit,int i,int j,int step){if(step == word.size())returntrue;if(i -1>=0&& visit[i-1][j]==false&& board[i-1][j]== word[step]){visit[i-1][j]=true;if(dfs(board, word, visit, i -1, j, step +1))returntrue;visit[i-1][j]=false;}if(i +1< board.size()&& visit[i+1][j]==false&& board[i+1][j]== word[step]){visit[i+1][j]=true;if(dfs(board, word, visit, i +1, j, step +1))returntrue;visit[i+1][j]=false;}if(j -1>=0&& visit[i][j-1]==false&& board[i][j-1]== word[step]){visit[i][j-1]=true;if(dfs(board, word, visit, i, j -1, step +1))returntrue;visit[i][j-1]=false;}if(j +1< board[0].size()&& visit[i][j+1]==false&& board[i][j+1]== word[step]){visit[i][j+1]=true;if(dfs(board, word, visit, i, j +1, step +1))returntrue;visit[i][j+1]=false;}returnfalse;}boolexist(vector<vector<char>>& board, string word){vector<vector<bool>> visit =vector<vector<bool>>(board.size(),vector<bool>(board[0].size(),false));for(int i =0; i < board.size();++i){for(int j =0; j < board[0].size();++j){if(board[i][j]== word[0]){visit[i][j]=true;if(dfs(board, word, visit, i, j,1))returntrue;visit[i][j]=false;}}}returnfalse;}
黄金矿工
int ret =0;
unordered_multimap<int,int> direction ={{0,1},{0,-1},{1,0},{-1,0}};voiddfs(vector<vector<int>>& grid, vector<vector<bool>>& visit,int i,int j,int quantity){if(quantity > ret) ret = quantity;for(auto& e : direction){int x = i + e.first, y = j + e.second;if((x >=0&& x < grid.size())&&(y >=0&& y < grid[0].size())&&(visit[x][y]==false)&&(grid[x][y]!=0)){visit[x][y]=true;dfs(grid, visit, x, y, quantity + grid[x][y]);visit[x][y]=false;}}}intgetMaximumGold(vector<vector<int>>& grid){vector<vector<bool>>visit(grid.size(),vector<bool>(grid[0].size(),false));for(int i =0; i < grid.size();++i){for(int j =0; j < grid[0].size();++j){if(grid[i][j]!=0){visit[i][j]=true;dfs(grid, visit, i, j, grid[i][j]);visit[i][j]=false;}}}return ret;}
不同路径 III
int ret =0;int count =0;
unordered_multimap<int,int> direction ={{0,1},{0,-1},{1,0},{-1,0}};voiddfs(vector<vector<int>>& grid, vector<vector<bool>>& visit,int i,int j,int step){if(grid[i][j]==2){if(count == step) ret +=1;return;}for(auto& e : direction){int x = i + e.first, y = j + e.second;if((x >=0&& x < grid.size())&&(y >=0&& y < grid[0].size())&&(visit[x][y]==false)&&(grid[x][y]!=-1)){visit[x][y]=true;dfs(grid, visit, x, y, step +1);visit[x][y]=false;}}}intuniquePathsIII(vector<vector<int>>& grid){vector<vector<bool>>visit(grid.size(),vector<bool>(grid[0].size()));int si, sj;for(int i =0; i < grid.size();++i){for(int j =0; j < grid[0].size();++j){if(grid[i][j]!=-1)++count;if(grid[i][j]==1){si = i;sj = j;}}}visit[si][sj]=true;dfs(grid, visit, si, sj,1);return ret;}