class Solution { public: //最后返回的结果 vector<vector<string>> ans; // 记录路径的信息,path的索引表示的第几列,因此对应的值就是第几行,这样才可以确定一个唯一的二维坐标 vector<int> path; // 标志记录信息 vector<bool> row; vector<bool> diagonal ; vector<bool> back_diagonal ; // idx表示现在走的是那一列,n表示总共多少列 void dfs(int idx, int n) { //递归的终止条件 if(idx >= n) { vector<string> chess; //有n行 for(int i=0;i<n;++i) { string tmp = ""; //有n列 for(int j=0;j<n;++j) { if(path[j] == i) { tmp += "Q"; } else { tmp += "."; } } chess.push_back(tmp); } ans.push_back(chess); return; } //idx表示当前走的是第几列 递归的主要部分 for(int i=0;i<n;++i) { if(!row[i] && !diagonal[idx+i] && !back_diagonal[idx-i + n-1]) { path[idx] = i; //第i行被占据了 row[i] = true; diagonal[idx+i] = true; back_diagonal[idx-i + n-1] = true; dfs(idx+1, n); row[i] = false; diagonal[idx+i] = false; back_diagonal[idx-i + n-1] = false; } } } vector<vector<string>> solveNQueens(int n) { ans.clear(); path.resize(n,-1); row.resize(n, false); diagonal.resize((2*n-1), false); back_diagonal.resize((2*n-1), false); dfs(0, n); return ans; } };
原文地址:https://www.cnblogs.com/randyniu/p/9219984.html
时间: 2024-10-09 21:36:48