DFS入门:全排列算法及POJ 1564 Sum it up详解

本文介绍了全排列算法如何利用DFS(深度优先搜索)实现,并结合POJ 1564 Sum it up问题,探讨了在解决求和问题时如何在全排列基础上进行去重。通过详细解释程序逻辑和关键变量,帮助读者理解DFS在解决此类问题中的核心思想。
摘要由CSDN通过智能技术生成

全排列算法是DFS(深度优先搜索)的一个简单入门应用。
假设我们现在给过一个数n, 要求我们输出从1到 n的n个数的所有排列方式。
详细要求可参考codevs中 1294全排列问题。

首先给出程序的主体及各个变量的作用:

#include<stdio.h>
#include<stdlib.h>
int main(void){
    int n;
    scanf("%d", &n);
    int *flag = (int *)malloc(sizeof(int) * (n + 1));
    int *result = (int *)malloc(sizeof(int) * (n + 1));
    int i;
    for(i = 1;i <= n;i++){
        flag[i] = 0;
    }
    int index = 1;
    DFS(result, flag, index, n);
    return 0;
}

①flag数组标志着第i位数字是否使用,当第i位数字没有使用的时候,flag[i] = 0, 当第i位数字已经被使用的时候, flag[i] = 1。
②result数组包含了要输出的结果。
③index变量代表着当前的第几层(也就是第几位数字)。
④flag数组以及result数组分配n + 1个空间是为了更直观,从数组[1]开始存放值。

接下来给出DFS函数:

void DFS(int *result, int *flag, int index, int n){
    int i;
    if(index == n + 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值