定义三个访问数组,列不能重复访问,正斜线不能重复访问, 反斜线不能重复访问。
其中正斜线用行下标减列下标唯一表示 总计2*N-1个,因为有负数结果,所以平移N-1位存储。
反斜线由行下标加列下标表示,也是2*N-1个。
class Solution {
public:
int N;
int res=0;
int Nqueen(int n) {
// write code here
if(n==1) return 1;
N = n; // 写成了 int N = n, 全局变量已经声明了,又定义了一次,一直结果不对
vector<bool> visited(n, false); // 列访问数组
vector<bool> xie_visited(2*N-1, false); // 正斜线访问数组
vector<bool> xie2_visited(2*N-1, false); // 反斜线访问数组
dfs(0, visited, xie_visited, xie2_visited);
return res;
}
void dfs(int i, vector<bool> &visited, vector<bool> &xie_visited, vector<bool> &xie2_visited){
if(i == N) {res++; return;}
for(int j=0; j < N; j++){
if(!visited[j] && !xie_visited[i-j+N-1] && !xie2_visited[i + j]){
visited[j] = true; // 标记访问
xie_visited[i-j + N - 1 ]= true;
xie2_visited[i + j] = true;
dfs(i+1, visited, xie_visited, xie2_visited);
visited[j] = false; // 回溯
xie2_visited[i + j] = false;
xie_visited[i- j + N - 1] = false;
}
}
}
};
全局变量和局部变量不能命名冲突,否则结果都不知道为什么错