| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 762 人关注过本帖
标题:看例子找算法
只看楼主 加入收藏
wudihuanying
Rank: 1
等 级:新手上路
帖 子:21
专家分:5
注 册:2011-7-4
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
看例子找算法
最近看c语言的科学与艺术,里面有道这样的题
找规律:
-----------------------

原始状态:
R B W W B B R W W R R W R B W
交换1和14(0为第一个字母,即上面的R):
R W W W B B R W W R R W R B B
交换4和13:
R W W W B B R W W R R W R B B
交换4和12:
R W W W R B R W W R R W B B B
交换1和4:
R R W W W B R W W R R W B B B
交换5和11:
R R W W W W R W W R R B B B B
交换2和6:
R R R W W W W W W R R B B B B
交换3和9:
R R R R W W W W W W R B B B B
交换4和10:
R R R R R W W W W W W B B B B
从上面的演示中找出一般的算法,使得对于任意的RWB三个字母组成的字符串,经过该算法后都可以排列成R`````RW``````WB`````B。
-----------------
想了很久想不出来,请网上高人赐教。
搜索更多相关主题的帖子: 艺术 c语言 
2011-08-04 18:43
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
选择排序
2011-08-04 18:49
loveshuang
Rank: 9Rank: 9Rank: 9
来 自:湖北武汉
等 级:蜘蛛侠
帖 子:270
专家分:1198
注 册:2010-11-14
收藏
得分:20 
这个不知可不可以
#include <stdio.h>

int main(void)
{
    char str[12];
    printf("输入10个字符,只能输W、R、B:");
    fgets(str,11,stdin);

    int l,h;
    l=0;
    h=9;
    for(int j=0;j<10&&l<=h;j++)
    {
        if(str[j]=='R')
        {
            char c1=str[j];
            str[j]=str[l];
            str[l++]=c1;
        }
        else if(str[j]=='B'&&j<=h)
        {
            char c2=str[j];                  
            str[j]=str[h];
            str[h--]=c2;
        }            
    }
    fputs(str,stdout);
    putchar('\n');
    return 0;
}
2011-08-04 21:03
wudihuanying
Rank: 1
等 级:新手上路
帖 子:21
专家分:5
注 册:2011-7-4
收藏
得分:0 
回复 3楼 loveshuang
感谢3楼,
看了下你的算法,理解了下你的思路。你是想:用j来扫描,用l来计入R,用h来计入B,对吧?
但是测试你的程序中,发现了一个bug:
比如输入:RRRBBWWBBB
经过程序转换的结果是:RRRBBWWBBB,而非理想的RRRWWBBBBB。
看了你的算法给我有些启发
希望我们一起来解决这个bug。
2011-08-05 11:50
wudihuanying
Rank: 1
等 级:新手上路
帖 子:21
专家分:5
注 册:2011-7-4
收藏
得分:0 
回复 3楼 loveshuang
程序代码:
#include<stdio.h>
#include<conio.h>
#define max 15
void main()
{
    char a[max+2];
    printf("请输入%d个字符,仅rwb,\n程序进行重新排序成:r```r,w```w,b```w.\n",max);
    fgets(a,max+1,stdin);
    int lh,rh,p;
    lh=0;rh=max-1;p=0;char tmp;
    while(p<=rh){
        if (a[p]=='r') {
            tmp=a[p];
            a[p]=a[lh];
            a[lh]=tmp;
            p++;
            lh++;
            continue;
        }
        if(a[p]=='b'){
            if(a[rh]!='b'){
                tmp=a[p];
                a[p]=a[rh];
                a[rh]=tmp;
                p++;
                rh--;
                if(a[p-1]=='r'){
                    p--;   
                }
            }
            else while(a[rh]=='b'){rh--;}
            continue;
        }
        if(a[p]=='w') p++;
    }

    for(int i=0;i<max;i++)
    {
        printf("%c",a[i]);
    }
    getch();
}
看看我这个怎么样,目前测试没有问题。
2011-08-05 15:29
loveshuang
Rank: 9Rank: 9Rank: 9
来 自:湖北武汉
等 级:蜘蛛侠
帖 子:270
专家分:1198
注 册:2010-11-14
收藏
得分:0 
           楼主不错哦,那个算法的思路是前后夹逼,很多题目可以用,给楼主出两个题再练练吧
1、一组非递减排列的整数,输入一个整数使得其等于其中两个数之和:数组为1,2,3,4,5,6,7,8,9;输入11,则输出11=2+9;只要找出第一个满足条件的就行,时间复杂度为O(n);
2、一组整数排列后成偶数都在左边,奇数都在右边,时间复杂度为O(n),空间复杂度为O(1);
2011-08-05 15:38
hjywyj
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:1114
专家分:2611
注 册:2010-4-14
收藏
得分:0 
最简单的:三次遍历字符串
2011-08-05 15:40
loveshuang
Rank: 9Rank: 9Rank: 9
来 自:湖北武汉
等 级:蜘蛛侠
帖 子:270
专家分:1198
注 册:2010-11-14
收藏
得分:0 
        三次太多了,要是在面试中用三次就0分了。。。
2011-08-05 15:45
qazujm1212
Rank: 2
等 级:论坛游民
帖 子:24
专家分:24
注 册:2011-3-23
收藏
得分:0 
#include <stdio.h>

char a[1000],b[1000],r[1000],w[1000];

int x,y,z;

int main()
{
    int i;
    gets(a);
    for (i=0;;i++)
    {
        if (a[i]=='\0')
            break;
        if (a[i]=='B')
            b[x++]=a[i];
        else if (a[i]=='R')
            r[y++]=a[i];
        else if (a[i]=='W')
            w[z++]=a[i];
    }
    printf ("%s%s%s",r,w,b);
}
2011-08-05 16:17
wudihuanying
Rank: 1
等 级:新手上路
帖 子:21
专家分:5
注 册:2011-7-4
收藏
得分:0 
回复 6楼 loveshuang
看了下你给的两道题
1.还不晓得时间,空间复杂度怎么算
2.懒得动脑子了···
O(∩_∩)O~,不做了。谢谢你的帮助。
2011-08-05 20:02
快速回复:看例子找算法
数据加载中...
 
   



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

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