给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
示例 2:
输入:candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
class Solution {
public:
vector<vector<int>> res;
vector<int> candidates;
vector<int> path;
void DFS(int start,int target){
if(target==0){
res.push_back(path);
return;
}
for(int i=start;i<candidates.size();i++){
if(target-candidates[i]>=0){
path.push_back(candidates[i]);
DFS(i,target-candidates[i]);
path.pop_back();
}
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
this->candidates = candidates;
DFS(0,target);
return res;
}
};
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
示例:
输入: 4
输出: 2
解释: 4 皇后问题存在如下两个不同的解法。
[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
class Solution {
public:
int res = 0;
int board[1000][1000];
int totalNQueens(int n) {
Backtrace(0,board,n);
return res;
}
//n代表填到第几行,n代表N皇后
void Backtrace(int n,int board[][1000],int N){
if(n==N){
res++;
return;
}
for(int i=0;i<N;i++){
board[n][i] = 1;
if(isValid(n,i,board,N)){
Backtrace(n+1,board,N);
}
board[n][i] = 0;
}
}
//判断摆放在某行某列是否合法
bool isValid(int row,int col,int board[][1000],int N){
//判断同列
for(int i=0;i<row;i++){
if(board[i][col]==1) return false;
}
//判断左对角线
for(int i=row-1, j=col-1; i>=0 && j>=0; i--, j--){
if(board[i][j]==1){
return false;
}
}
//判断右对角线
for(int i=row-1, j=col+1; i>=0 && j<N; i--, j++){
if(board[i][j]==1){
return false;
}
}
return true;
}
};