三色旗问题,有没有更简化的方法
就是说一条绳子上有 红、白、蓝 三种颜色的旗子若干,我的程序里分别用 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 编辑 ]









