| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 535 人关注过本帖
标题:一道递归题,自己是在写不出来,求助!
取消只看楼主 加入收藏
vdestroyer
Rank: 2
等 级:论坛游民
帖 子:136
专家分:14
注 册:2009-1-7
结帖率:96.43%
收藏
已结贴  问题点数:20 回复次数:1 
一道递归题,自己是在写不出来,求助!
写一个程序,能将打乱的ABCDE 五个字母排好顺序。
排序的方法只能无限次的重复以下两个方式:

方式b:将最左边的两个字母互换位置
方式s:将最右边的字母移动到最左边

程序接收(输入)一个字符串,输出该字符串 最少需要多少步能排成 ABCDE,要用递归。
这里给两个输入数据和结果,以便测试:
BAECD:11步
BECAD:7步


下面是自己写的一个,肯定是不对的,请高手指教。
程序代码:
#include <stdio.h>
#include <conio.h>
#include <string.h>
char p[6];
char tmp;
void b(void) {
    tmp = p[1];
    p[1] = p[0];
    p[0] = tmp;
    printf("b: %s\n",p);
}
void s(void) {
    int len = strlen(p);
    char tmp = p[len-1];
    for (int i = len-1; i--; i >= 0) {
        p[i+1] = p[i];
    }
    p[0] = tmp;
    printf("s: %s\n",p);
}
int solve(char way, int step) {
    int i;
    if(way == 'b') { b();}
    if(way == 's') { s();}
    if(strcmp(p,"ABCDE") == 0) {
        return step;
    }
    if(p[2] - p[0] == 1) {
        way = 'b';
        solve(way,step+1);
        tmp = p[1];
        p[1] = p[0];
        p[0] = tmp;
    }
    if(p[2] - p[0] < 1) {
        way = 's';
        solve(way,step+1);
        tmp = p[0];
        for(i=0; i<strlen(p)-1; i++) {
            p[i] = p[i+1];
        }
        p[i] = tmp;
    }
}
int main (void) {
    printf("What is the string ? "); scanf("%s",p);
    printf("\n Need %d steps\n",solve('a',0));
}

搜索更多相关主题的帖子: 字母 测试 字符串 
2012-05-09 23:16
vdestroyer
Rank: 2
等 级:论坛游民
帖 子:136
专家分:14
注 册:2009-1-7
收藏
得分:0 
因为这道题考的是递归,所以用递归。

至于为什么用 p[2] - p[0] ==1
比如,现在的字母排序是 BECAD。就是说,B 在下标0,C 在下标2的位置上。用 p[2] - p[0] ==1 条件,就可以让前两个字母,也就是 B 和 E 互换。这样做的目的是让B 和C"挨着",有利于排序。当然这么想不一定对。
2012-05-11 00:27
快速回复:一道递归题,自己是在写不出来,求助!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027617 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved