leetcode N-Queens I & II N皇后问题
来源:互联网 发布:投稿被怀疑数据造假 编辑:程序博客网 时间:2024/04/29 03:18
题目:https://oj.leetcode.com/problems/n-queens/
题意:N皇后问题,后边还有一个II,结题思路和这道题一样,就是输出有多少种结果,不用输出结果是什么了,更加简答了
思路:回溯,用深度优先进行递归
1.递归按照行数走,当行数>n,则表示可以打印结果了
2.每次递归都进行一个循环来试每个列可以进行
3.如果在循环中,一个列可以了,那么再写一个循环判断斜对角可不可以,判断斜对角时,比如当前递归是在第r行,那么,这个小循环的终止条件就是j<=r,再往下的行都是还没插入过皇后的,肯定不存在冲突
代码:
class Solution {public: vector<vector<string> > result; int row[501]; //记录每一行的皇后放在哪个位置上,用来在判断斜线位置上有没有皇后,并用来最后把统计好的位置输出 int col[501]; //记录第几列有皇后 void dfs(int r,int n){ //递归完成第r行的情况 int i,j; if(r == n){ vector<string> str; for( i = 0;i<n;i++){ string tmp(n,'.'); tmp[row[i]] = 'Q'; str.push_back(tmp); } result.push_back(str); return; } for( i = 0 ; i < n ; i++){ //大循环用来判断第i列的情况 if(col[i] == 0){ for(j = 0 ; j < r ; j++){ //小循环判断位置在[r,i]的这个格子在斜线位置上有没有冲突 if(abs(i- row[j]) == abs(j - r)) break; } if(j == r) { row[r] = i; col[i] = 1; dfs(r+1,n); col[i] = 0; row[r] = 0; } } } } vector<vector<string> > solveNQueens(int n) { result.clear(); dfs(0,n); return result; }};
这题以前学c++的时候,简直是神题,和汉诺塔一样,都是根本看不懂的题,想想以前真好
0 0
- leetcode N-Queens I & II N皇后问题
- [LeetCode 51&52] N-Queens I & II (N皇后问题)
- [LeetCode] [N皇后问题] N-Queens & N-Queens II
- leetcode51/52-N-Queens I/II(n皇后问题)
- Leetcode #51&52 N-Queens I&II N皇后问题 1&2 解题报告
- N-Queens II N皇后问题(有几种放法)@LeetCode
- 【LeetCode】N-Queens II N皇后问题 回溯法
- LeetCode:N-Queens I (n皇后问题)
- leetcode 52. N-Queens II & leetcode 51 N-Queens (N皇后问题)
- [Leetcode] N Queens I,II
- LeetCode - N-Queens I && II
- LeetCode | N-Queens I,II
- N-Queens N皇后问题@LeetCode
- leetcode-51 N-Queens N皇后问题
- N 皇后问题 : Leetcode 51. N-Queens
- N-Queens 八皇后问题I
- leetCode 52.N-Queens II (n皇后问题II) 解题思路和方法
- LeetCode OJ 之 N-Queens II(N皇后 - 二)
- 理解PHP对象注入
- Android Nexus6 和iPhone6内置应用对比分析
- 欢迎使用CSDN-markdown编辑器
- 解决Ubuntu下无法启动Weka GUI
- 手动创建复杂格式的长微博
- leetcode N-Queens I & II N皇后问题
- 单点登录之CAS SSO从入门到精通(第二天)
- 项目管理与“三岁看老”
- 【Uni2D】PackedRect
- 抽象类
- linux 内核网络协议栈
- 做事模式的思考:想、说、写、做
- hdu3652---B-number(数位dp)
- 莫比乌斯反演