简单全排列的逻辑(递归实现)
2023-09-11 14:18:49 时间
全排列:
将一个包含了N个元素的数组进行所有可能组合的排列。
例如: 问题: 我们将集合a[]={1,2,3}进行排列,如何进行解决?
这里,我们可以运用分治的思路将问题转化为
以下三个新的问题:
- 1开头的全排列
- 2开头的全排列
- 3开头的全排列
我们利用DFS与回溯的概念,
当我们分到最后一个字符串数字的时候即可判断是否满足条件!
——以此得到下图的概念
即得到以下6个排列!
1,2,3 | 1,3,2 |
---|---|
2,1,3 | 2,3,1 |
3,1,2 | 3,2,1 |
题目代码:
#include "stdio.h"
#include "windows.h"
void swap(int &a, int &b) {//交换函数
int t = a;
a = b;
b = t;
}
void perm(int *data, int index, int end) {
if (index == end) {//当我分到最后一个数字了,判断条件
for (int i = 0; i < end; i++)
printf("%d", data[i]);
printf("\n");
}
else
for (int i = index; i < end; i++) {//从index 开始 其实枝剪了一部分
swap(data[i], data[index]);//交换
perm(data, index + 1, end);//dfs调用
swap(data[i], data[index]);//复原
}
}
int main() {
int data[] = { 1,2,3 };
perm(data, 0, 3);
return 0;
}
提示:
如果你不慎一步步带入了步骤且现在被饶了进去不知所踪。
我们利用最少的数字去思考,即1,2两个数字!
- 1:我们第一步直接走到index==end 输出 1,2;
- 2:我们还原之后再到下一个循环去 data[1]与data[0]做交换,data[1]与data[1]交换,保持原样,index=2输出,2,1;
#include "stdio.h"
#include "windows.h"
void swap(int &a, int &b) {
int t = a;
a = b;
b = t;
}
void perm(int *data, int index, int end) {
if (index == end) {
for (int i = 0; i < end; i++)
printf("%d", data[i]);
printf("\n");
}
else
for (int i = index; i < end; i++) {
swap(data[i], data[index]);
perm(data, index + 1, end);
swap(data[i], data[index]);
}
}
int main() {
int data[] = {1,2};
perm(data, 0, 2);
return 0;
}
相关文章
- 用适配器模式处理复杂的UITableView中cell的业务逻辑
- java实现逻辑推断
- upload-labs关卡文件上传过滤逻辑解析
- Python Django 自定义Manager实现批量删除(逻辑删除)
- RHCSA之路----18、调整逻辑卷大小
- SAP CRM Attachment 数据物理存放的逻辑
- Python语言学习:Python语言学习之逻辑控制语句(if语句&for语句&while语句&range语句&with语句)的简介、案例应用之详细攻略
- 深入理解Android音视频同步机制(二)NuPlayer的avsync逻辑
- 使用GrowPart工具完成对LVM逻辑卷的在线热扩容
- 拥有尖端逻辑工厂的半导体制造商数量
- 3. 逻辑漏洞之支付漏洞
- FPGA - 7系列 FPGA内部结构之SelectIO -05- 逻辑资源之OLOGIC
- spinal HDL - 09 - 时序逻辑