backtracking及其应用

article/2025/9/23 6:29:12

文章目录

    • 应用场景
      • N-Queens
      • Permutations
      • Permutations II
    • 参考资料

backtracking(回溯法)是一种算法,主要用来解决带限制条件的计算问题( CSP)。
特点如下:

  • 和暴力匹配算法一样,会尝试所有的可能性。
  • 比暴力匹配算法好,会在尝试的过程中不断丢弃不正确的解。

应用场景

N-Queens

链接:https://leetcode.com/problems/n-queens/
代码

func solveNQueens(n int) [][]string {board := make([][]int, n)for i := 0; i < n; i++ {board[i] = make([]int, n)}var res [][]stringres = solve(res, board, 0)return res
}// row: 当前行
func solve(res [][]string, board [][]int, row int) [][]string {if row == len(board) {res = append(res, construct(board))return res}for col := 0; col < len(board); col++ {if check(board, row, col) {board[row][col] = 1res = solve(res, board, row+1)board[row][col] = 0}}return res
}func check(board [][]int, row int, col int) bool {for i := 0; i < row; i++ {if board[i][col] == 1 {return false}rowDiff := row - i// 45度if col + rowDiff < len(board) && board[i][col + rowDiff] == 1 {return false}// 135度if col - rowDiff >= 0 && board[i][col - rowDiff] == 1 {return false}}return true
}func construct(board [][]int) []string {var res []stringfor i := 0; i < len(board); i++ {var tmp stringfor j := 0; j < len(board); j++ {if board[i][j] == 1 {tmp += "Q"} else {tmp += "."}}res = append(res, tmp)}return res
}

Permutations

链接:https://leetcode.com/problems/permutations/
代码

func permute(nums []int) [][]int {var res [][]intboard := make([]int, len(nums))for i := 0; i < len(board); i++ {board[i] = math.MinInt32}res = solve(res, board, nums, 0)return res
}func solve(res [][]int, board []int, nums []int, index int) [][]int {if index == len(board) {res = append(res, construct(board))return res}for col := 0; col < len(board); col++ {if check(board, col) {board[col] = nums[index]res = solve(res, board, nums, index+1)board[col] = math.MinInt32}}return res
}func check(board []int, col int) bool {return board[col] == math.MinInt32
}func construct(board []int) []int {res := make([]int, len(board))for i := 0; i < len(board); i++ {res[i] = board[i]}return res
}

同样是回溯,这道题还有另一种解法

func permute(nums []int) [][]int {var res [][]intused := make([]bool, len(nums))var tmpList []intres = backtrack(res, tmpList, used, nums)return res
}func backtrack(res [][]int, tmpList []int, used []bool, nums []int) [][]int {if len(tmpList) == len(nums) {res = append(res, construct(tmpList))return res}for i := 0; i < len(nums); i++ {if used[i] {continue}used[i] = truetmpList = append(tmpList, nums[i])res = backtrack(res, tmpList, used, nums)tmpList = tmpList[0:len(tmpList)-1]used[i] = false}return res
}func construct(tmpList []int) []int {res := make([]int, len(tmpList))for i := 0; i < len(tmpList); i++ {res[i] = tmpList[i]}return res
}

这里简单说下两者的区别
解法1:

参考N-Queens,题目演化为一个1x3的棋盘,然后将nums中的元素逐个放到棋盘的第一列、第二列、第三列。

解法2:

符合正常思路,遍历nums,将元素逐个放到一个list中。

对于Permutations,我觉得解法1和解法2都是OK的,但是对于Permutations II,解法1扩展起来就比较困难了。

Permutations II

链接:https://leetcode.com/problems/permutations-ii/
代码
【仅贴出和Permutations不同的地方】
在这里插入图片描述

参考资料

https://www.interviewbit.com/courses/programming/topics/backtracking/
https://leetcode.com/problems/permutations/discuss/18239/A-general-approach-to-backtracking-questions-in-Java-(Subsets-Permutations-Combination-Sum-Palindrome-Partioning)
https://leetcode.com/problems/permutations-ii/discuss/18594/Really-easy-Java-solution-much-easier-than-the-solutions-with-very-high-vote


http://chatgpt.dhexx.cn/article/AXvkFl2Q.shtml

相关文章

bt5 mysql字典,backtrack5下载

对于喜欢使用linux操作系统的盆友们来说&#xff0c;backtrack5将会是你们不错的选择&#xff0c;它完美支持Live CD和Live USB启动方式&#xff0c;可以让用户直接从移动介质启动该系统。有了BT5&#xff0c;您就不用担心网络无法进行访问&#xff0c;因为它可是拥有无线射频技…

BackTrack5使用3proxy实现内网穿透

本次实验使用BT5攻击机中的3proxy实现内网穿透实验。 实验机IP地址&#xff1a;192.168.113.140 首先使用搭建apache2服务&#xff0c;监听本地80端口 apache2服务搭建&#xff1a; 进入/etc/apache2中&#xff0c;确认apache2.conf的根目录。并确定ports.conf的监听端口为8…

backtracking及其应用2

文章目录 SubsetsSubsets II 接上文&#xff1a; backtracking及其应用 Subsets 链接&#xff1a;https://leetcode.com/problems/subsets/ 如果没有接触过backtracking&#xff0c;这道题的常规解法应该是位操作 func subsets(nums []int) [][]int {lth : len(nums)cnt : i…

Backtracking algorithm梳理

回溯法简介 注意下面这句话 由于回溯通常结果集都记录在回溯树的路径上&#xff0c;因此如果不进行撤销操作&#xff0c; 则可能在回溯后状态不正确导致结果有差异&#xff0c; 因此需要在递归到底部往上冒泡的时候进行撤销状态。 如果你每次递归的过程都拷贝了一份数据&#x…

ARM backtrace 实战分析

记录一下arm backtrace 分析过程 前言 嵌入式开发中&#xff0c;如果发生异常如内存访问越界等情况&#xff0c;有时会非常难debug到底是哪里出错&#xff0c;近来看了一下back trace回溯的功能及实现,在这里做个笔记。 backtrace就是回溯堆栈&#xff0c;简单的说就是可以列…

backtrack 5 r3

1.BT5默认用户名:root.密码:toor(公司是yeslabccies) 2.进入图形化界面命令:startx 3.更改密码&#xff1a;sudo passwd root 扫描工具 第一部分网络配置&#xff1a; 4.网络配置文件有两个&#xff1a; /etc/network/interfaces 和 /etc/resolv.conf 前一个存放网卡接口…

backtrack3安装使用教程

一、准备篇 1、一个有可破解无线信号的环境。如我在家随便搜索出来的信号。 2、带无线网卡的电脑一台&#xff08;笔记本台式机均可&#xff0c;只要无线网卡兼容BT3&#xff09;&#xff0c;我用的是三星R467的上网本。  3、2G以上优盘一个&#xff08;我用的是2G的&#x…

安装BackTrack5 R3

最近买了本《Python绝技》&#xff0c;里面的很多实例都是在BackTrack系统中运行的。初次接触BackTrack系统&#xff0c;才知道它是一套专业的计算机安全检测的Linux操作系统&#xff0c;内部集成了200多种安全检查工具。虽然现在BackTrack已经被Kali Linux所代替&#xff0c;不…

BackTrack5(BT5)各版本下载

BT5R3(最新版本)http://www.nigesb.com/backtrack-5-r3-released.html BT5R2 KDE版32位&#xff1a; http://ftp.halifax.rwth-aachen.de/backtrack/BT5R2-KDE-32.iso GNOME32位&#xff1a;http://ftp.halifax.rwth-aachen.de/backtrack/BT5R2-GNOME-32.iso BT5R1 KDE版32位…

小白使用backtrack5

在此先感谢飞飞老师录制的教学视频 在这几天的了解中知道了这样一个过程 linux–>Debian–>Ubuntu–>backtrack–>kali 可能理解有点片面&#xff0c;但是可以让我了解到linux系统是基础&#xff0c;而且linux的内核大部分都是用C写的&#xff0c;部分是汇编语言…

虚拟机安装BackTrack 5 的教程详解!

废话不多说&#xff0c;直接上教程&#xff01;如在安装过程中有些步骤界面没显示&#xff0c;即直接下一步即可。 打开虚拟机&#xff0c;新建虚拟机 选择自定义安装 选择你的映像文件&#xff0c;点击下一步 这里要注意了&#xff0c;系统选择Linux&#xff0c;版本选择U…

struts2漏洞升级至2.5.30额外补充

由于部分老项目需要还在使用struts2框架&#xff0c;由于最新发布struts2漏洞&#xff0c;需要将其版本升级至struts2.5.30&#xff0c;同步还有其他依赖和配置需要调整&#xff0c;大概可参考这个文章&#xff1a; struts升级至2.5.26遇到的各种bug及解决方案_谷同学的博客-C…

linux struts2漏洞,Struts2漏洞分析,漏洞波及全系版本

Struts漏洞分析 Apache Struts团队已经发布了Struts 2.3.15.1安全更新版本。在Struts2.3.15.1版本之前&#xff0c;存在着严重的安全漏洞&#xff0c;如果现在一些比较大的网站是用JAVA做的&#xff0c;没有把版本升级&#xff0c;还用的是Strtus2.3.15.1版本之前的话&#xff…

渗透知识-Struts2漏洞

Struts2漏洞利用实例 如果存在struts2漏洞的站&#xff0c;administrator权限&#xff0c;但是无法加管理组&#xff0c;内网&#xff0c;shell访问500. 1.struts2 漏洞原理&#xff1a;struts2是一个框架&#xff0c;他在处理action的时候&#xff0c;调用底层的getter/sette…

Struts2 远程代码执行漏洞复现(附Struts2漏洞检测工具)

0x00 Struts2 简介 Struts2 是 Apache 软件组织推出的一个相当强大的 Java Web 开源框架&#xff0c;本质上相当于一个 servlet。Struts2 基于 MVC 架构&#xff0c;框架结构清晰。通常作为控制器&#xff08;Controller&#xff09;来建立模型与视图的数据交互&#xff0c;用…

Struts2漏洞利用原理

概述: Struts2是apache项目下的一个web 框架,目前web框架中非常流行的都是mvc设计模式、经典例子例如:python的Django、Flask;java的ssm等。因为使用MVC设计模式,所以在框架内部处理用户数据流参数的事后就不可避免的存在数据在不同层次流转的问题。struts2作为java的一款成…

Struts2漏洞 - Struts2-015 Struts2-016 Struts2-045

文章目录 Struts2简介Struts2历史漏洞Struts2历史漏洞发现Struts2框架识别 Struts2历史漏洞利用Struts2-015漏洞简介影响范围环境搭建漏洞复现 Struts2-016漏洞简介影响范围环境搭建漏洞复现 Struts2-045漏洞简介影响范围环境搭建漏洞复现 Struts2简介 Apache Struts是美国阿帕…

Struts2漏洞S2-005复现

1.漏洞描述 s2-005漏洞的起源源于S2-003(受影响版本: 低于Struts 2.0.12)&#xff0c;struts2会将http的每个参数名解析为OGNL语句执行(可理解为java代码)。OGNL表达式通过#来访问struts的对象&#xff0c;struts框架通过过滤#字符防止安全问题&#xff0c;然而通过unicode编码…

Struts2 漏洞集合

Struts2 漏洞集合 总结了一部分 Strtus2 漏洞&#xff0c;虽然现在这部分的漏洞很少了&#xff0c;但也是学习的一部分&#xff0c;收集的并不全面&#xff0c;后续会做补充。 漏洞环境搭建可以使用在线的 Vulfocus &#xff0c;或者使用docker部署 S2-001 &#xff08;CVE-…

Vulhub靶场之struts2漏洞复现

简介 struts2漏洞中属s2系列杀伤力最大&#xff0c;可以造成远程命令执行漏洞。 Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架。Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执行漏洞(CVE-2020-17530)&#xff0c;在使用某些tag等情况下可能…