一道递归题,自己是在写不出来,求助!
写一个程序,能将打乱的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));
}









