经典的老掉牙的题目
不重复题目了,懂得都懂
先上一下罗嗦的代码:
总之要记得判断对角线:横坐标之差的绝对值等于纵坐标之差的绝对值!!!
class Solution {
public:
int m;
bool matrix[10][10];
bool check(int x,int y){
for(int i=0;i<x;i++){
if(matrix[i][y]==true){
return false;
}
}
for(int i=0;i<x;i++){
for(int j=0;j<m;j++){
int a=y-j;
int b=x-i;
if(matrix[i][j]==true&&abs(a)==abs(b)){
return false;
}
}
}
return true;
}
void dfs(int index,int &c){
if(index==m){
c++;
return;
}
for(int i=0;i<m;i++){
if(check(index,i)){
matrix[index][i]=true;
dfs(index+1,c);
matrix[index][i]=false;
}
}
}
int totalNQueens(int n) {
//搜索
int cnt=0;
m=n;
dfs(0,cnt);
return cnt;
}
};
优化版代码:
class Solution {
public:
int cnt=0;
int totalNQueens(int n) {
vector<int>pos(n);//这一步至关重要,因为我们不必再用二维数组去储存位置,而是直接可以用一维数组只需要记录下来每一行所在的列数
dfs(pos,n,0);
return cnt;
}
private:
void dfs(vector<int>& pos,int n,int row){
if(row==n){
cnt++;
return;
}
for(pos[row]=0;pos[row]<n;pos[row]++){//一边for循环一边赋值
if(issafe(pos,n,row)){
dfs(pos,n,row+1);
}
}
}
bool issafe(vector<int> &pos,int n,int row){
for(int i=0;i<row;i++){
if(pos[i]==pos[row]||abs(i-row)==abs(pos[i]-pos[row]))return false;
}
return true;
}
};