C语言:电话号码字母排列

这点B玩意写了一下午加一晚上,但是理解了回溯法也值了。
具体解释我写在注释里
#include<stdio.h>
char a[1000];//最后要输出的
int f=0;//全局变量当做指针
int a1[10]={0,1,2,3,4,5,6,7,8,9};
char s1[10][10]={"","",“abc”,“def”,“ghi”,“jkl”,“mno”,“pqrs”,“tuv”,“wxyz”};//和上一行的哈希对照
int a8=0;//全局变量用来回溯
void kai(int *a2,int start,int len1,char *s5){//a2是输入的数,len1是长度,char s5是记录回溯的
s5[0]代表记录第一个键当前字母
if(start>=len1){//某棵回溯树走到了尽头
int ii;
for(ii=0;ii<a8;ii++){
a[f++]=s5[ii];//赋值
}
a[f++]=’,’;//加逗号
a8–;//!!!!!重要 回退版本 不回退就重复了 比如 应该是 ae 你发现会变成ade
return;
}

int len=3;//手机键盘字母只有4个或者3个 这里进行处理
if(a2[start]==7||a2[start]==9)
len=4;
int i=0;
for(i;i<len;i++){
s5[a8++]=s1[a1[a2[start]]][i];//将某一个键的对应位置的字母放进数组
kai(a2,start+1,len1,s5);//递归

a8=start;//精髓的地方来了,每次结束下层后 a8需要回退到本层 不然就层层叠叠了
}
}
void main(){
int len;
scanf("%d",&len);
int a2[len];
int i;
for(i=0;i<len;i++){
int wqe;
scanf("%d",&wqe);
a2[i]=wqe;
}
char s5[100];

kai(a2,0,len,s5);
puts(a);

}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值