1 回溯
https://mp.weixin.qq.com/s/nMUHqvwzG2LmWA9jMIHwQQ
leetcode 46 全排列:
https://leetcode.cn/problems/permutations/
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> ret;
vector<int> track;
backtrack(track,ret,nums);
return ret;
}
void backtrack(vector<int>& track,vector<vector<int>>& ret,vector<int>& nums){
if(track.size()==nums.size()){
ret.push_back(track);
return;
}
else{
int len=nums.size();
for(int i=0;i<len;i++){
if(find(track.begin(),track.end(),nums[i])==track.end()){
track.push_back(nums[i]);
backtrack(track,ret,nums);
track.pop_back();
}
}
}
return;
}
};
leetcode 51 N皇后
https://leetcode.cn/problems/n-queens/
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> ret;
vector<string> track;
for(int i=0;i<n;i++){
track.push_back("");
for(int j=0;j<n;j++){
track[track.size()-1]+='.';
}
}
backtrack(ret,track,0,n);
return ret;
}
void backtrack(vector<vector<string>>& ret,vector<string>& track,int row,int n){
if(row==n){
ret.push_back(track);
return;
}
else{
for(int col=0;col<n;col++){
if(isvalid(track,row,col)){
track[row][col]='Q';
backtrack(ret,track,row+1,n);
track[row][col]='.';
}
}
}
return;
}
int isvalid(vector<string> track,int row,int col){
int n=track.size();
for(int i=0;i<n;i++){
if(i!=row&&track[i][col]=='Q'){
return 0;
}
}
for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--){
if(track[i][j]=='Q'){
return 0;
}
}
for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++){
if(track[i][j]=='Q'){
return 0;
}
}
return 1;
}
};
leetcode 52 N皇后 Ⅱ
https://leetcode.cn/problems/n-queens-ii/
class Solution {
public:
int totalNQueens(int n) {
int ret=0;
int *pointer=&ret;
vector<string> track;
for(int i=0;i<n;i++){
track.push_back("");
for(int j=0;j<n;j++){
track[track.size()-1]+='.';
}
}
backtrack(pointer,track,0,n);
return ret;
}
void backtrack(int *ret,vector<string>& track,int row,int n){
if(row==n){
*ret+=1;
return;
}
else{
for(int col=0;col<n;col++){
if(isvalid(track,row,col)){
track[row][col]='Q';
backtrack(ret,track,row+1,n);
track[row][col]='.';
}
}
}
return;
}
int isvalid(vector<string> track,int row,int col){
int n=track.size();
for(int i=0;i<n;i++){
if(i!=row&&track[i][col]=='Q'){
return 0;
}
}
for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--){
if(track[i][j]=='Q'){
return 0;
}
}
for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++){
if(track[i][j]=='Q'){
return 0;
}
}
return 1;
}
};
2 数学
判断三个边能不能组成一个三角形判断两个小边的和是否大于第三条边就可以。