我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页
往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章
- DFS 算法:记忆化搜索
此系列更新频繁,求各位读者点赞
关注我可以了解更多内容哦
偷偷告诉你,我正在冲
1100
粉
{\color{Gray} {\small 偷偷告诉你,我正在冲1100粉} }
偷偷告诉你,我正在冲1100粉
你们有什么想了解的可以发在评论区,我会仔细的看
{\color{Gray} {\small 你们有什么想了解的可以发在评论区,我会仔细的看} }
你们有什么想了解的可以发在评论区,我会仔细的看
1100
粉时我会抓几个做文章
{\color{Gray} {\small1100粉时我会抓几个做文章} }
1100粉时我会抓几个做文章
目录
- 今天我们学什么
- 例题
- 全排列问题
- 总结
今天我们学什么
今天我们要学习的是——全排列问题!
我们将会以一道“简单”的题入手,带你了解这个“有趣”的算法
例题
那么例题就是——全排列问题!
题目如下
全排列问题
你可能会想要一个for循环暴力枚举,但是这样太慢了
我们可以使用dfs
作为OIer / coder的你听到了我的话, 打出了GG 打出了一下的代码
#include <bits/stdc++.h>
using namespace std;
int n, a[15];
bool flag[15];
void dfs(int step) {
// 如果step超过了n,说明已经填满了所有位置,打印当前排列
if (step > n) {
for (int i = 1; i <= n; i++) {
printf("%5d", a[i]);
}
printf("\n");
return;
}
// 遍历所有可能的数字,填入当前位置
for (int i = 1; i <= n; i++) {
// 如果数字i没有被使用过,进行递归
if (!flag[i]) {
flag[i] = true; // 标记数字i被使用
a[step] = i; // 将数字i填入当前位置
dfs(step + 1); // 递归填下一个位置
flag[i] = false; // 恢复数字i未被使用
}
}
}
int main() {
scanf("%d", &n);
dfs(1); // 从第一个位置开始填数字
return 0;
}
怎么样,全排列问题是不是很简单呢?
总结
以下内容使用了AI大模型
以上代码是一个用于输出1到n的全排列的程序。通过深度优先搜索的方式实现,利用flag数组标记数字是否已经被使用过,a数组存储当前的排列。程序从第一个位置开始填数字,递归地对下一个位置进行填数,直到填满所有位置,打印当前排列。
思路步骤:
输入n表示全排列的长度。
调用dfs(1)开始填数字。
在dfs函数中,如果当前位置大于n,表示已经填满了所有位置,打印当前排列。
遍历所有可能的数字,如果某个数字没有被使用过,标记为已使用,填入当前位置,然后递归地填下一个位置。
递归完成后,恢复当前数字为未使用状态,继续遍历下一个可能的数字。
递归结束后,返回主函数。
该程序可以生成1到n的全排列,并按照一定格式进行输出。
再见!记得关注我哦