算法分析与设计第八周
来源:互联网 发布:木托盘设计软件 编辑:程序博客网 时间:2024/06/08 05:23
分析:最直接的方法,即用二维数组表示一个棋盘,然后每次找寻合法的位置放置皇后。但是这个方法效率较低,因为每次查找合法的位置时都要使用循环,耗费大量的时间。可以消去这些循环查找合法位置所耗费的时间,即找出空闲的列,和斜线。斜线分上斜线与下斜线。每条上斜线上的格子,行加列为固定值,每条下斜线的格子,行减列为固定值。因此不再是检查空闲的格子,而是检查空闲的列和斜线,这可以根据传来的参数(列)立即确定,插入时也只是写入对列和斜线的控制,从而消去循环。然而八皇后问题本质上复杂度比指数还高,所以这种改进没有改变复杂度,但在同一个n下,可以减少计算量。
代码:
const int maxSize = 32;class Solution {public: vector<vector<string>> solveNQueens(int n) { vector<vector<string>> totalResult; vector<string> aResult; string temp; initial(n); for (int i = 0; i < n; ++i) { if (unguarded(i)) insert(i); if (count == size) { for (int j = 0; j < size; ++j) { temp = ""; for (int k = 0; k < size; ++k) { if (k == queenInRow[j]) temp += 'Q'; else temp += '.'; } aResult.push_back(temp); } totalResult.push_back(aResult); } insert(i + 1); remove(i); } return totalResult; } void initial(int n) { size = n; count = 0; resultNumber = 0; for (int i = 0; i < maxSize; ++i) colFree[i] = true; for (int i = 0; i < 2 * maxSize - 1; ++i) downFree[i] = true; for (int i = 0; i < 2 * maxSize - 1; ++i) upFree[i] = true; } bool unguarded(int col) const { return colFree[col] && upFree[count + col] && downFree[count - col + size - 1]; } void insert(int col) { queenInRow[count] = col; colFree[col] = false; upFree[count + col] = false; downFree[count - col + size - 1] = false; ++count; } void remove(int col) { --count; colFree[col] = true; upFree[count + col] = true; downFree[count - col + size - 1] = true; }private: int size; int count; long resultNumber; int queenInRow[maxSize]; bool colFree[maxSize]; bool downFree[2 * maxSize - 1]; bool upFree[2 * maxSize - 1];};
测试通过:
阅读全文
0 0
- 算法分析与设计第八周
- 算法分析与设计第八周:300. Longest Increasing Subsequence
- 第八周算法分析与设计:Permutation Sequence
- 算法分析与设计课程作业第八周#1
- 算法设计与应用基础-第八周
- 算法设计与应用基础:第八周
- 【算法分析与设计】【第八周】712. Minimum ASCII Delete Sum for Two Strings
- 算法分析与设计丨第八周丨LeetCode(12)——Friend Circles(Medium)
- 算法设计与应用基础:第八周(1)
- 算法结构与设计基础作业第八周
- 算法分析与设计
- 算法设计与分析
- 算法分析与设计
- 算法设计与分析
- 算法设计与分析
- 算法分析与设计
- 算法设计与分析
- 算法设计与分析
- JS 日期的获取和计算 ios不兼容问题
- 2017.10.28 排序 思考记录
- HDU-1710 给出前序中序输出后序
- css揭秘-2
- jsp基本介绍
- 算法分析与设计第八周
- Python学习(5)--列表
- C++面试题之 main函数执行完之后还会调用其他的函数吗?
- JAVA进阶之Servlet、JSP
- lua学习笔记—table
- Android 退出app,循环遍历退出
- Questmobile应用商店实力榜:应用宝稳居第一领跑行业
- 超现实VR乐园:一家自主研发VR游戏和动捕方案的体验馆
- 宋仲基同款 美国队长vivo Xplay5旗舰版今日全国火爆上市