当前位置: 首页 > wzjs >正文

网站建设要实现的目标专业外贸网络推广

网站建设要实现的目标,专业外贸网络推广,上海正规做网站公司,网站优化排名易下拉系统LeetCode51 目录 题目描述示例思路分析代码段代码逐行讲解复杂度分析总结的知识点整合总结 题目描述 N 皇后问题:将 n 个皇后放置在 n x n 的棋盘上,使得皇后彼此之间不能相互攻击(即任何两个皇后不能在同一行、同一列或同一斜线上&#x…

LeetCode51

目录

  • 题目描述
  • 示例
  • 思路分析
  • 代码段
  • 代码逐行讲解
  • 复杂度分析
  • 总结的知识点
  • 整合
  • 总结

题目描述

N 皇后问题:将 n 个皇后放置在 n x n 的棋盘上,使得皇后彼此之间不能相互攻击(即任何两个皇后不能在同一行、同一列或同一斜线上)。

返回所有不同的解决方案。每个解决方案包含一个明确的 n x n 的棋盘布局,其中 'Q' 表示皇后,'.' 表示空位。


示例

示例 1

输入:

n = 4

输出:

[[".Q..",  // 解法 1"...Q","Q...","..Q."],["..Q.",  // 解法 2"Q...","...Q",".Q.."]
]

解释:

  • 4 皇后问题有两个不同的解决方案。

示例 2

输入:

n = 1

输出:

[["Q"]]

解释:

  • 1 皇后问题只有一个解决方案。

思路分析

问题核心

我们需要在 n x n 的棋盘上放置 n 个皇后,使得它们互不攻击。皇后可以攻击同一行、同一列或同一斜线上的其他皇后。

思路拆解

  1. 回溯算法
    • 使用回溯算法逐行放置皇后,并在每一行中尝试所有可能的列。
  2. 冲突检测
    • 使用三个布尔数组分别记录列、左斜线和右斜线的冲突情况。
    • 列冲突:ca[j] 表示第 j 列是否被占用。
    • 左斜线冲突:cb[i + j] 表示左斜线是否被占用。
    • 右斜线冲突:cc[n - 1 - (i - j)] 表示右斜线是否被占用。
  3. 递归终止条件
    • 如果成功放置了 n 个皇后,则将当前棋盘布局加入结果列表。
  4. 回溯
    • 在递归返回时,撤销当前皇后的放置,并恢复冲突数组的状态。

代码段

class Solution {public List<List<String>> solveNQueens(int n) {List<List<String>> ans = new ArrayList<>();boolean[] ca = new boolean[n]; boolean[] cb = new boolean[2 * n - 1]; boolean[] cc = new boolean[2 * n - 1];char[][] table = new char[n][n]; for (int i = 0; i < n; i++) {Arrays.fill(table[i], '.'); }dfs(0, n, table, ca, cb, cc, ans); return ans;}static void dfs(int i, int n, char[][] table,boolean[] ca,boolean[] cb,boolean[] cc,List<List<String>> ans) {if (i == n) { List<String> solution = new ArrayList<>();for (char[] chars : table) {solution.add(new String(chars)); }ans.add(solution);return;}for (int j = 0; j < n; j++) { if (ca[j] || cb[i + j] || cc[n - 1 - (i - j)]) {continue;}table[i][j] = 'Q';ca[j] = cb[i + j] = cc[n - 1 - (i - j)] = true; dfs(i + 1, n, table, ca, cb, cc, ans); table[i][j] = '.'; ca[j] = cb[i + j] = cc[n - 1 - (i - j)] = false;        }}
}

在这里插入图片描述


代码逐行讲解

1. 初始化结果列表

List<List<String>> ans = new ArrayList<>();
  • ans 用于存储所有合法的棋盘布局。

2. 初始化冲突数组

boolean[] ca = new boolean[n]; // 列冲突
boolean[] cb = new boolean[2 * n - 1]; // 左斜线冲突
boolean[] cc = new boolean[2 * n - 1]; // 右斜线冲突
  • ca 记录每一列是否被占用。
  • cb 记录每一条左斜线是否被占用。
  • cc 记录每一条右斜线是否被占用。

3. 初始化棋盘

char[][] table = new char[n][n];
for (int i = 0; i < n; i++) {Arrays.fill(table[i], '.'); // 初始化棋盘
}
  • table 表示棋盘,初始化为 '.'

4. 调用 DFS

dfs(0, n, table, ca, cb, cc, ans);
  • 从第 0 行开始递归放置皇后。

5. DFS 函数

static void dfs(int i, int n, char[][] table,boolean[] ca,boolean[] cb,boolean[] cc,List<List<String>> ans) {
  • DFS 函数的定义,用于递归放置皇后。

6. 找到一个解

if (i == n) {List<String> solution = new ArrayList<>();for (char[] chars : table) {solution.add(new String(chars));}ans.add(solution);return;
}
  • 如果成功放置了 n 个皇后,则将当前棋盘布局加入结果列表。

7. 尝试放置皇后

for (int j = 0; j < n; j++) {
  • 在第 i 行的每一列尝试放置皇后。

8. 冲突检测

if (ca[j] || cb[i + j] || cc[n - 1 - (i - j)]) {continue;
}
  • 如果当前列、左斜线或右斜线有冲突,则跳过。

9. 放置皇后

table[i][j] = 'Q';
ca[j] = cb[i + j] = cc[n - 1 - (i - j)] = true;
  • 放置皇后,并标记冲突。

10. 递归

dfs(i + 1, n, table, ca, cb, cc, ans);
  • 递归放置下一行的皇后。

11. 回溯

table[i][j] = '.';
ca[j] = cb[i + j] = cc[n - 1 - (i - j)] = false;
  • 回溯时撤销皇后的放置,并恢复冲突数组的状态。

复杂度分析

时间复杂度

  • 最坏情况下需要遍历所有可能的放置方式,时间复杂度为 O(n!)

空间复杂度

  • 需要存储所有合法的棋盘布局,空间复杂度为 O(n^2 * n!)
  • 递归栈的深度为 n,因此额外空间复杂度为 O(n)

总结的知识点

1. 回溯算法

  • 使用回溯算法逐行放置皇后,并在递归返回时撤销操作。

2. 冲突检测

  • 使用布尔数组记录列、左斜线和右斜线的冲突情况。

3. 递归与回溯

  • 通过递归实现深度优先搜索,并通过回溯撤销操作。

4. 棋盘表示

  • 使用二维字符数组表示棋盘,并用 'Q''.' 分别表示皇后和空位。

整合

class Solution {public List<List<String>> solveNQueens(int n) {List<List<String>> ans = new ArrayList<>(); // 结果列表boolean[] ca = new boolean[n]; // 列冲突boolean[] cb = new boolean[2 * n - 1]; // 左斜线冲突boolean[] cc = new boolean[2 * n - 1]; // 右斜线冲突char[][] table = new char[n][n]; // 棋盘for (int i = 0; i < n; i++) {Arrays.fill(table[i], '.'); // 初始化棋盘}dfs(0, n, table, ca, cb, cc, ans); // DFSreturn ans;}static void dfs(int i, int n, char[][] table,boolean[] ca,boolean[] cb,boolean[] cc,List<List<String>> ans) {if (i == n) { // 找到一个解List<String> solution = new ArrayList<>();for (char[] chars : table) {solution.add(new String(chars)); // 将棋盘布局加入解}ans.add(solution); // 将解加入结果列表return;}for (int j = 0; j < n; j++) { // 尝试在第 i 行的每一列放置皇后if (ca[j] || cb[i + j] || cc[n - 1 - (i - j)]) { // 冲突检测continue;}table[i][j] = 'Q'; // 放置皇后ca[j] = cb[i + j] = cc[n - 1 - (i - j)] = true; // 标记冲突dfs(i + 1, n, table, ca, cb, cc, ans); // 递归table[i][j] = '.'; // 回溯ca[j] = cb[i + j] = cc[n - 1 - (i - j)] = false; // 撤销冲突标记}}
}

总结

通过回溯算法和冲突检测,能够高效地解决 N 皇后问题。

http://www.dtcms.com/wzjs/462691.html

相关文章:

  • 网站站长是什么意思怎么做百度网页推广
  • 网站首页界面设计珠海网站建设制作
  • 济南快速建站模板网站优化工具
  • 西安市城乡建设管理局网站6江北关键词优化排名seo
  • 建设大厦网站seo详细教程
  • 溧水城市建设招标网站关键词提取
  • 沈阳网站建设蓝顶网络排名软件
  • 河南建达工程建设监理公司网站搜索引擎营销的英文缩写
  • js可以做动态网站吗chatgpt 链接
  • wordpress的hookseo关键词分析
  • 关于网站开发的自我评价聊城网站seo
  • 做网站的一定要开80或8080端口网站建设介绍ppt
  • 万维网的网站互联网培训
  • 网站开发cms热门关键词查询
  • 微信小程序公众平台浙江seo公司
  • 2014个人网站备案如何让网站被百度收录
  • 做牛仔裤的小视频网站win10优化软件
  • 网站平台做期货产品市场推广方案范文
  • wordpress菜单html5湖南正规关键词优化报价
  • 凡客诚品首页htmlseo管家
  • 做视频网站需要执照吗今日国内重大新闻
  • 公司图案设计百合seo培训
  • 网站关键词库是怎么做的网站seo优化建议
  • 国内老牌的广州网站建设关键词优化骗局
  • 网站设计的主要内容windows优化大师怎么样
  • php做网站技术方案seo百度快照优化公司
  • 北京市网站建设 维护推荐百度站长平台怎么用
  • 做设计什么兼职网站网上打广告有哪些软件
  • 怎么进入微信官方网站国内最新新闻摘抄
  • DW做旅游网站毕业设计模板seo系统优化