华师大 OJ 3023

题目描述:点击打开链接


值得一提的是:这个问题调用了递归的方法来解决问题

另外,一开始的时候,我在cmp_char里面直接使用了return strcmp(*((char*)a),*((char*)b)); 却忘记了strcmp是要对比字符串,所以会往后扫描直到'\0',所以会访问他不该访问的内存,导致程序出错!这也说明了,写程序的时候,写完一个阶段,就去debug一下,这样可以减少最后再debug的时候带来的痛苦感觉。


解决方法:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void solve();

int main(){
    int t;
    int k;
    scanf("%d\n",&t);
    for(k=0;k<t;k++){
        printf("case #%d:\n",k);
        solve();
    }
}

//1. 读入数据,保存到一个字符串数组里面str_in里面
//2. 找出str_in里面不同的字母,放在str_diff里面。个数就是stelen(str_diff),或者保存到num里面
//3. 对str_diff进行排序,变成升序,从str_diff[0]开始存放。
//4. 使用递归解决。

int cmp_char(const void *a,const void *b){
    char c1[2],c2[2];
    c1[0] = *(char*)a;
    c2[0] = *(char*)b;
    c1[1] = '\0';
    c2[1] = '\0';
    return strcmp(c1,c2);
}


void comb(char *s, char * t){
    char tt[17];
    if(*s){
        sprintf(tt,"%s%c",t,s[0]);
        printf("%s\n",tt);
        comb(s+1,tt);
        comb(s+1,t);
    }
}
void solve(){
    char str_in[17];
    char str_diff[17];
    char t[17];
    t[0] = '\0';



    int k,i;
    int num_diff;
    int flag;
    //initialization
    num_diff = 0;
    k = 0;
    for(k=0;k<17;k++){
        str_diff[k] = -1;//先初始化为0,代表这个里面没有存放字符
    }
    flag = 0;//flag=0代表这个字符之前没有记录过

    scanf("%s",str_in);
    for(k=0; k < strlen(str_in); k++){
        flag = 0;
        for(i=0;i<num_diff;i++){
            if(str_diff[i] == str_in[k]){
                flag = 1;//这个字符之前就记录过了
                break;
            }
        }
        if(flag == 0){
            str_diff[num_diff++] = str_in[k];
        }
    }
    str_diff[num_diff] = '\0';
    qsort(str_diff,num_diff,sizeof(str_diff[0]),cmp_char);
    comb(str_diff,t);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值