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.要记得回溯!!因为这里不能重复,所以下面的决策不清除的话会对本次的决策有影响