| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 660 人关注过本帖
标题:三色旗问题,有没有更简化的方法
取消只看楼主 加入收藏
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
结帖率:97.26%
收藏
已结贴  问题点数:20 回复次数:5 
三色旗问题,有没有更简化的方法
就是说一条绳子上有 红、白、蓝 三种颜色的旗子若干,
我的程序里分别用 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 编辑 ]
搜索更多相关主题的帖子: 旗子 三色旗 而且 如何 
2013-03-24 17:47
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
求解啊!~帮忙简化一下嘛

三十年河东,三十年河西,莫欺少年穷!
2013-03-24 19:18
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
回复 3楼 wp231957
   我知道,我写的代码太繁琐了,大家都不愿意看,不过不一定要看的,也可以提出对这一算法的思路

三十年河东,三十年河西,莫欺少年穷!
2013-03-24 20:00
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
回复 5楼 qunxingw
  确实有点联系,那个是起泡法对数据排序,可以引用,谢啦!

三十年河东,三十年河西,莫欺少年穷!
2013-03-24 20:25
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
回复 7楼 tompobing
恩恩  欢迎指教

三十年河东,三十年河西,莫欺少年穷!
2013-03-24 22:53
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
回复 9楼 fanpengpeng
谢啦!   我看一下

三十年河东,三十年河西,莫欺少年穷!
2013-03-25 08:17
快速回复:三色旗问题,有没有更简化的方法
数据加载中...
 
   



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

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