题目:

The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

Given an integer n, return all distinct solutions to the n-queens puzzle.

Each solution contains a distinct board configuration of the n-queens' placement, where 'Q' and '.' both indicate a queen and an empty space respectively.

For example,
There exist two distinct solutions to the 4-queens puzzle:

[
[".Q..", // Solution 1
"...Q",
"Q...",
"..Q."], ["..Q.", // Solution 2
"Q...",
"...Q",
".Q.."]
]

代码:

class Solution {
public:
static vector<vector<string> > solveNQueens(int n)
{
vector<vector<string> > ret;
if ( n== ) return ret;
vector<string> tmp;
vector<bool> colUsed(n,false);
vector<bool> diagUsed1(*n-,false);
vector<bool> diagUsed2(*n-,false);
Solution::dfs(ret, tmp, n, colUsed, diagUsed1, diagUsed2);
return ret;
}
static void dfs(
vector<vector<string> >& ret,
vector<string>& tmp,
int n,
vector<bool>& colUsed,
vector<bool>& diagUsed1,
vector<bool>& diagUsed2 )
{
const int row = tmp.size();
if ( row==n )
{
ret.push_back(tmp);
return;
}
string curr(n,'.');
for ( size_t col = ; col<n; ++col )
{
if ( !colUsed[col] && !diagUsed1[col+n--row] && !diagUsed2[col+row] )
{
colUsed[col] = !colUsed[col];
diagUsed1[col+n--row] = !diagUsed1[col+n--row];
diagUsed2[col+row] = !diagUsed2[col+row];
curr[col] = 'Q';
tmp.push_back(curr);
Solution::dfs(ret, tmp, n, colUsed, diagUsed1, diagUsed2);
tmp.pop_back();
curr[col] = '.';
diagUsed2[col+row] = !diagUsed2[col+row];
diagUsed1[col+n--row] = !diagUsed1[col+n--row];
colUsed[col] = !colUsed[col];
}
}
}
};

tips:

深搜写法:

1. 找到一个解的条件是tmp的长度等于n

2. 在一列中遍历每个位置,是否能够放置Q,并继续dfs;返回结果后,回溯tmp之前的状态,继续dfs。

一开始遗漏了对角线也不能在有超过一个Q的条件,补上之后就AC了。

========================================

第二次过这道题,string(n, '.')一直写成了string('.', n),改过来就AC了。

class Solution {
public:
vector<vector<string> > solveNQueens(int n)
{
vector<vector<string> > ret;
if ( n< ) return ret;
vector<string> tmp;
vector<bool> colUsed(n, false);
vector<bool> r2l(*n-, false);
vector<bool> l2r(*n-, false);
Solution::dfs(ret, tmp, n, colUsed, r2l, l2r);
return ret;
}
static void dfs(
vector<vector<string> >& ret,
vector<string>& tmp,
int n,
vector<bool>& colUsed,
vector<bool>& r2l,
vector<bool>& l2r)
{
if ( tmp.size()==n )
{
ret.push_back(tmp);
return;
}
int r = tmp.size();
string row(n, '.');
for ( int i=; i<n; ++i )
{
if ( colUsed[i] || r2l[i-r+n-] || l2r[i+r] ) continue;
colUsed[i] = true;
r2l[i-r+n-] = true;
l2r[i+r] = true;
row[i] = 'Q';
tmp.push_back(row);
Solution::dfs(ret, tmp, n, colUsed, r2l, l2r);
tmp.pop_back();
row[i] = '.';
colUsed[i] = false;
r2l[i-r+n-] = false;
l2r[i+r] = false;
}
}
};

最新文章

  1. java 复制字串算法
  2. hdu 5929 Basic Data Structure
  3. mvn打包时添加version和profile
  4. Effective C++ -----条款35:考虑virtual函数以外的其他选择
  5. WPF Litbox样式和模板
  6. poj 2151
  7. 更改EBSserver域名/IP
  8. oracle在SQLPLUS 和PLSQL建 job 的区别
  9. 使用strace+pstack利器分析程序性能
  10. RAID基础知识总结
  11. 201521123040《Java程序设计》第11周学习总结
  12. 初学servlet之使用web.xml配置
  13. ●BZOJ 3640 JC的小苹果
  14. This is very likely to create a memory leak 异常
  15. vector某元素是否存在、查找指定元素 、去重
  16. 高性能mysql的事物隔离级别
  17. 应用监控CAT之cat-consumer源码阅读(二)
  18. SQL Server T—SQL 表连接
  19. maven项目添加mysql的链接驱动
  20. Hibernate的七种映射关系之基本映射

热门文章

  1. 您H1B身份的申请或H1B延期的申请提交对地方了吗?
  2. C#之MVC3继续整理问题
  3. javascript面向对象继承和原型
  4. 64位系统中为VS2012添加OpenGL工具包
  5. BZOJ 1229: [USACO2008 Nov]toy 玩具
  6. javaweb基础(25)_jsp标签实例一
  7. shell脚本,awk结合正则来打印文件里面的内容。
  8. java从键盘输入学生成绩,找出最高分,并输出学生成绩等级。
  9. nodejs 实现图片上传
  10. 第31题:LeetCode946. Validate Stack Sequences验证栈的序列