Leetcode N-Queens II
来源:互联网 发布:英格拉姆体测数据 编辑:程序博客网 时间:2024/05/17 17:44
题意:要求输出N皇后问题的解的个数。
思路:返回解的个数。
class Solution {public: vector<vector<string> > re; int l; int totalNQueens(int n) { l = n; string ts; vector<string> tes; for(int i = 0; i < n; i ++) ts += '.'; for(int i = 0; i < n; i ++) tes.push_back(ts); dfs(tes, 0); return re.size(); } void dfs(vector<string> grid, int s) { if(s == l) { for(int i = 0; i < l; i ++) { for(int j = 0; j < l; j ++) { if(grid[i][j] == 'x') grid[i][j] = '.'; } } re.push_back(grid); return; } vector<string> mygrid; for(int i = 0; i < l; ++ i) { mygrid = grid; if(mygrid[s][i] == 'x') continue; if(mygrid[s][i] == '.') { mygrid[s][i] = 'Q'; for(int j = s + 1; j < l; j ++) mygrid[j][i] = 'x'; for(int j = i - 1, k = s + 1; j >=0 && k < l; j --, k ++) mygrid[k][j] = 'x'; for(int j = i + 1, k = s + 1; j < l && k < l; j ++, k ++) mygrid[k][j] = 'x'; //for(int it = 0; it < l; it ++) cout << mygrid[it] << endl; //cout << endl; dfs(mygrid, s + 1); } } return; }};
另一种思路是不生成可行解,直接判断是否可行。判断是否可行有O(1)的方法。对于(x, y) 上的某个皇后,满足xi + yi = x + y和 n - xi + yi = x + y的位置都不能放置。
class Solution {public: int count; int l; int totalNQueens(int n) { vector<bool> c1(n, false); vector<bool> c2(n * 2, false); vector<bool> c3(n * 2, false); count = 0; l = n; dfs(n, c1, c2, c3); return count; } void dfs(int row, vector<bool> c1, vector<bool> c2, vector<bool> c3) { if(row == 0) count ++; for(int i = 0; i < l; ++ i) { if(c1[i] || c2[row + i] || c3[l - row + i]) continue; else { c1[i] = true; c2[row + i] = true; c3[l - row + i] = true; dfs(row - 1, c1, c2, c3); c1[i] = false; c2[row + i] = false; c3[l - row + i] = false; } } }};
0 0
- LeetCode: N-Queens II
- LeetCode : N-Queens II
- [Leetcode] N-Queens II
- 【leetcode】N-Queens II
- LeetCode: N Queens II
- [LeetCode]N-Queens II
- LeetCode - N-Queens II
- LeetCode:N-Queens II
- 【leetcode】N-Queens II
- LeetCode:N-Queens II
- Leetcode: N-Queens II
- leetcode N-Queens II
- LeetCode | N-Queens II
- Leetcode: N-Queens II
- LeetCode N-Queens II
- Leetcode N-Queens II
- N-Queens II -- LeetCode
- N-Queens II - LeetCode
- 判断当前界面是不是桌面
- 【前端攻城狮之路】手把手教你用CSS画三角形(百度15前端研发笔试卷)
- LINQ体验(2)——C# 3.0新语言特性和改进(上篇)
- AndroidStudio插件开发(进阶篇之Action机制)
- cogs740 [网络流24题]分配问题
- Leetcode N-Queens II
- hive 与 kylin的搭建
- Java扑克游戏(多人多牌数比较游戏)的实现
- 使用Kettle连接动态分库
- 利用opencv进行换脸
- AM3352笔记
- Libsvm与Liblinear源码剖析与封装(一)
- 常见性能优化策略的总结
- JSP运行原理与JSP隐式对象(9个)