| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 660 人关注过本帖
标题:三色旗问题,有没有更简化的方法
只看楼主 加入收藏
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
结帖率:97.26%
收藏
已结贴  问题点数:20 回复次数:10 
三色旗问题,有没有更简化的方法
就是说一条绳子上有 红、白、蓝 三种颜色的旗子若干,
我的程序里分别用 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
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:4 
对算法不咋熟

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

三十年河东,三十年河西,莫欺少年穷!
2013-03-24 20:00
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:4 

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

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

三十年河东,三十年河西,莫欺少年穷!
2013-03-24 22:53
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:4 
你这个应该就是一个简单的排序的问题吧 要求不高的话 用冒泡排排应该就行了
优化之后的冒泡排序 关键是要记住每趟跑下来之后已经排好序的部分,
下一趟的话直接跑未排序的就行了 已经排好的就不要重复排了。
程序代码:
#include <stdio.h>
#include <string.h>

#define MAX_LEN 50
#define DES 0
#define ASC 1

void BubbleSort_str(char *str, int n, char dir);

int main(void)
{
    char banner[MAX_LEN]; 
    
    scanf("%s", banner);
    BubbleSort_str(banner, strlen(banner), DES);
    printf("%s", banner);

    return 0;
}

/*

 * 冒泡排序

 * 参数:待排序数组, 长度, 方向(!=0 升序, ==0 降序)

 * 返回:指针返回

 */ 
void BubbleSort_str(char *str, int n, char dir)
{
    int i, j;
    char tmp;
    
    if(n < 2) return;
    
    while(n > 1){
        for(i=j=1; i < n; i++)
            if(str[i-1]<str[i] ^ dir!=0){
                j = i;  //j记录最后交换的位置,该位置之后的所有字符均已排序 
                tmp = str[i-1];
                str[i-1] = str[i];
                str[i] = tmp; 
            }    
        n = j;  //n记录每趟排序后仍然乱序的长度 
    }
}

人生是一场错过 愿你别蹉跎
2013-03-25 03:22
韶志
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.019764 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved