三色旗问题,有没有更简化的方法
就是说一条绳子上有 红、白、蓝 三种颜色的旗子若干,我的程序里分别用 A B C 表示,
起初绳子上的旗子是无序的,要求把旗子分类,并排列成 蓝、白、红 的顺序,
要如何移动次数才会最少?
注意:只能在绳子上进行移动,也就是说只允许使用一个阵列,而且一次只能移动两个旗子。
下面是我的程序,求简化~
程序代码:
#include<stdio.h> #define M 50 main() { int i,j,k,n,t=0,p=0; char a[M]; printf("请输入A、B、C的序列:"); for(i=0;i<M;i++) //输入序列; { a[i]=getchar(); if(a[i]=='\n') break; } printf("\n对A进行排序:\n"); for(j=0;j<=i;j++) printf("%c",a[j]); //打印序列; for(k=0;k<i;k++) //对A进行排序工作; { loop:if(i-k==t) //设置一个t用来记录遇到A的次数,如果排到第k个元素而i-k=t的话说明遇到了已经排好的A,所以排序完成,中断循环; break; else if(a[k]=='A') { t++; //计数; for(n=0;n<k;n++) //输出A之前的元素; putchar(a[n]); a[i]=a[k]; for(j=k;j<i;j++) //遇到A并把A移至最后,再输出A原先位置以后的元素; { a[j]=a[j+1]; putchar(a[j]); } printf("\n"); goto loop; //如果遇到A,A后移,而移到A原先位置的元素也可能是A,所以要对此位置再次进行判断; } else continue; //如果没遇到A则对下一位置上的元素进行判断; } printf("\nA的排序结果:\n"); for(j=0;j<i;j++) //输出对A的排序结果; printf("%c",a[j]); printf("\n\n"); /*以上是对A进行排序,把A移到最后,下面要对B进行排序,方法同A。*/ printf("对B进行排序:\n"); for(j=0;j<i-t;j++) printf("%c",a[j]); //打印序列; putchar('\n'); for(k=0;k<i-t;k++) { loop2:if(i-k-t==p) //设置一个p用来记录遇到B的次数,如果排到第k个元素而i-k-t=p的话说明遇到了已经排好的B,所以排序完成,中断循环; break; else if(a[k]=='B') { p++; //计数; for(n=0;n<k;n++) //输出B之前的元素; putchar(a[n]); a[i+1]=a[k]; for(j=k;j<i-t-1;j++) { a[j]=a[j+1]; putchar(a[j]); } a[i-1-t]=a[i+1]; putchar(a[i-1-t]); putchar('\n'); goto loop2; //如果遇到B,B后移,而移到B原先位置的元素也可能是B,所以要对此位置再次进行判断; } else continue; //如果没遇到B则对下一位置上的元素进行判断; } printf("\nB的排序结果:\n"); for(j=0;j<i-t;j++) //输出对B的排序结果; printf("%c",a[j]); printf("\n"); printf("\n最终排序结果:\n"); for(j=0;j<i;j++) //输出对B的排序结果; printf("%c",a[j]); printf("\n"); return 0; }
[ 本帖最后由 韶志 于 2013-3-24 19:18 编辑 ]