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