回溯法练习

1.求幂集

任务描述

本关任务:有一个含n个字符数组a,所有元素均不相同,设计一个算法求其所有子集(幂集)。

编程要求

根据提示,在右侧编辑器补充代码,计算并输出字符数组a的所有幂集。

测试说明

平台会对你编写的代码进行测试:

预期输出: {} {c} {b} {bc} {a} {ac} {ab} {abc}

#include <stdio.h>
#include <string.h>
#define MAXN 100
/*******************begin************************/
void ppp(char *a,int *x){
    printf("{");
    for(int k=0;k<3;k++){
        if(x[k]==1){
            printf("%c",a[k]);
        }
    }
    printf("} ");
}
void dfs(char *a,int n,int i, int *x){
    if (i>=3){
        ppp(a,x);
        return;
    }
    x[i]=0;
    dfs(a,n,i+1,x);
    x[i]=1;
    dfs(a,n,i+1,x);
}

/********************end*************************/
int main()
{
	char a[]={'a','b','c'};			
	int n=3;
	int x[MAXN];					
	memset(x,0,sizeof(x));	
	dfs(a,n,0,x);
	printf("\n");
}

 错误原因:

1.当i==3或者i>=3的时候,必须要return,不然就会无限次递归,但是第二题是for(i=1;i<3;i++)这种就不需要,因为for循环会限制次数,次数到了就会自动返回调用它的地方

2.这道题不需要回溯:是因为这是一个子空间数,只是要看本次的取还是不取,与下面的决策无关,而3只要下面的不会影响现在的决策,就不用管它,反正到最后也会被覆盖

2.求全排列

任务描述

本关任务:有一个含n个整数的数组a,所有元素均不相同,求其所有元素的全排列。。

编程要求

根据提示,在右侧编辑器补充代码,输出数组a的所有元素的全排列。

测试说明

平台会对你编写的代码进行测试:

预期输出: a的全排列: (1,2,3) (1,3,2) (2,1,3) (2,3,1) (3,2,1) (3,1,2)

#include <stdio.h>
/*******************begin************************/

void dfs(int *a,int n,int i){
    if(i==3){
        printf("(");
        for(int k=0;k<3;k++){
            printf("%d",a[k]);
            if(k!=2) printf(",");
        }
        printf(") ");
    }
    for(int j=i;j<3;j++){
        int temp = a[i];
        a[i]=a[j];
        a[j]=temp;
        dfs(a,n,i+1);
        temp = a[i];
        a[i] = a[j];
        a[j]=temp;
    }
}

/********************end*************************/
int main()
{
	int a[]={1,2,3};
	int n=3;
	printf("a的全排列:\n");
	dfs(a,n,0);
	printf("\n");
}

 注意点:

这道题没什么坑,就是一个排列数模板,重点就是记住排列数有两个要点

1.i为决策的层数,则 (j=i;i<n;j++),j从i开始

2.要记得回溯!!因为这里不能重复,所以下面的决策不清除的话会对本次的决策有影响

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值