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

求排列:swap交换法

核心:

分治+回溯

  1. dfs(s,t)表示:本轮要放的位置是s,待排列的区间是[s,t]
  2. 对于当前位置s,尝试将[s,t]内的每个元素放到s一次
  3. swap(a[s],a[i]):
    (1) a[s]->a[i]将a[s]这个数扔到待排序部分
    (2) a[s]<-a[i]将a[i]这个数放到位置s上
  4. dfs(s+1,t):放第s+1个位置
  5. swap(a[s],a[i]):回溯
  6. 同一层dfs(s,t):遍历每一种可能——尝试在位置s放不同的数

模版:

void dfs(int s,int t)//正在放位置为s的数 
{if(s==t){//若[s,t]只有一个数 a[s]原地不动 for(int i=startIndx;i<=t;++i) cout<<a[i];cout<<"\n";}for(int i=s;i<=t;++i){swap(a[s],a[i]);//位置s放数a[i] dfs(s+1,t);//放位置s+1 swap(a[s],a[i]);//换回来 }
}

例子:

假设数组是[1,2,3],要得到这三个数的全排列

dfs(0,2):当前要放第0个位置的数
|---i=0: swap(a[0],a[0]) -> [1,2,3] 第0个位置放a[0]
|        dfs(1,2):当前要放第1个位置的数
|		 |--i=1: swap(a[1],a[1]) -> [1,2,3] 第1个位置放a[1]
|		 |		 dfs(2,2):		cout<<[1,2,3]
|		 |		 swap(a[1],a[1]) -> [1,2,3] 换回来(回溯)
|		 |--i=2: swap(a[1],a[2]) -> [1,3,2] 第1个位置放a[2]
|		 |		 dfs(2,2):		cout<<[1,3,2]
|		 |		 swap(a[1],a[2]) -> [1,2,3] 换回来(回溯)
|		 swap(a[0],a[0]) -> [1,2,3]
|
|---i=1: swap(a[0],a[1]) -> [2,1,3] 第0个位置放a[1]
|        dfs(1,2):当前要放第1个位置的数
|		 |--i=1: swap(a[1],a[1]) -> [2,1,3]
|		 |		 dfs(2,2):		cout<<[2,1,3]
|		 |		 swap(a[1],a[1]) -> [2,1,3]
|		 |--i=2: swap(a[1],a[2]) -> [2,3,1]
|		 |		 dfs(2,2):		cout<<[2,3,1]
|		 |		 swap(a[1],a[2]) -> [2,1,3]
|		 swap(a[0],a[1]) -> [1,2,3]
|
|---i=2: swap(a[0],a[2]) -> [3,2,1] 第0个位置放a[2]dfs(1,2):当前要放第1个位置的数|--i=1: swap(a[1],a[1]) -> [3,2,1] |		 dfs(2,2):		cout<<[3,2,1] |		 swap(a[1],a[1]) -> [3,2,1] |--i=2: swap(a[1],a[2]) -> [3,1,2]|		 dfs(2,2):		cout<<[3,1,2]|		 swap(a[1],a[2]) -> [3,2,1]swap(a[0],a[2]) -> [1,2,3]

变式:

求数组某段区间的全排列,类似于求\((A^k_n)\)

int a[]={1,7,3,2};
int startIndx,endIndx;void dfs(int s,int t)//正在放位置为s的数 
{if(s==t){//若[s,t]只有一个数 a[s]原地不动 for(int i=startIndx;i<=t;++i) cout<<a[i];cout<<"\n";}for(int i=s;i<=t;++i){swap(a[s],a[i]);//位置s放数a[i] dfs(s+1,t);//放位置s+1 swap(a[s],a[i]);//换回来 }
}int main()
{startIndx=1,endIndx=3;dfs(startIndx,endIndx); return 0;
} 
http://www.jsqmd.com/news/427087/

相关文章:

  • Windows牛逼还是Linux牛逼?这场争论,纯属浪费时间
  • 专业干货:低查重AI教材写作工具的使用方法与优势!
  • 造相Z-Image模型软件测试指南:确保生成质量与稳定性
  • 一天一个Python库:jsonschema - JSON 数据验证利器
  • 开箱即用:皇城大门春联生成终端部署指南,小白也能轻松上手
  • Ostrakon-VL-8B模型推理性能测试:从YOLOv8检测到VL理解的端到端延迟分析
  • 零基础玩转Neeshck-Z-lmage_LYX_v2:手把手教你本地AI绘画
  • 网络自动化学习-基于PySNMP的批量巡检(练习版)
  • 想选国内优质长效防腐降阻剂厂家?这几种方法要知道,变电站接地施工/铜覆钢扁铁/降阻接地模块,降阻剂企业怎么选择 - 品牌推荐师
  • Playwright 代码生成深度解析
  • 西恩士:清洁度测试系统品牌厂家的定制化专家,解决您的专属痛点! - 仪器权威论
  • YOLOv8训练实战:为AnythingtoRealCharacters2511构建专用检测模型
  • SoC的设计和应用
  • Playwright 追踪查看器深度解析
  • 射阳河口潮汐表查询2026-03-03
  • 新年贺卡不用愁!用这款AI工具,快速生成精美数字化春联贺卡
  • GLM-4.7-Flash从零开始:Jupyter中加载模型、构造prompt与评估
  • 西恩士工业:清洁度测试系统品牌厂家的全链条解决方案专家! - 仪器权威论
  • CosyVoice2-0.5B效果实测:中英日韩四语混合文本发音连贯性
  • 分期乐京东卡套装回收指南:快速流程让你的利益最大化 - 团团收购物卡回收
  • Qwen3-ASR-0.6B快速上手:52语种语音识别镜像免配置实操手册
  • 西恩士:清洁度测试系统品牌厂家的技术流,软硬兼施的行业标杆! - 仪器权威论
  • Qwen2-VL-2B-Instruct效果展示:同一指令下中英文文本跨语言语义对齐能力
  • 计算机毕业设计springboot人事管理系统 基于SpringBoot框架的企业人力资源信息管理平台设计与实现 采用Java技术的员工档案与薪酬考勤综合管理系统开发
  • Qwen3-VL-8B与LaTeX协同:学术论文图表自动分析与描述生成
  • DAMOYOLO-S开源大模型部署教程:ModelScope内置模型免配置启动
  • 别再把 RAG 当搜索:它本质上是在重构 Context
  • RVC模型运维指南:服务监控、弹性伸缩与故障恢复
  • Qwen2.5-7B-Instruct效果展示:中日韩越泰阿多语种实时翻译对比测试
  • 西恩士工业:技术清洁度分析专家,清洁度测试设备品牌首选! - 仪器权威论