标题:发一道题,求出这个字符串
只看楼主
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
回复 38楼 beyondyf
杨大哥,好久不见。

最近你也不常来了,我一个算法渣渣也变成了别人眼里的大神,颇有几分山中无老虎,猴子称大王的味道。


[此贴子已经被作者于2016-12-20 11:53编辑过]



[fly]存在即是合理[/fly]
2016-12-20 11:50
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:0 
回复 41楼 azzbcc
给大王请安!
beyondyf大神常年神龙见首不见尾,还好有大王在!希望新的一年大王带我们飞!

[此贴子已经被作者于2016-12-21 08:33编辑过]

2016-12-20 13:32
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
回复 42楼 xzlxzlxzl
哇,不用这样嘲讽我吧。

玩笑玩笑。


[fly]存在即是合理[/fly]
2016-12-20 14:01
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 42楼 xzlxzlxzl
吐槽一下:说自己是渣渣……我不想说话了~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-20 14:27
小白老黑
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2016-12-23
得分:0 
我是文科生。。。
2016-12-23 23:52
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Len_str 128
#define Len_rules 3
/*************************
*功能:根据二维数组所表述的字符出现先后次序,整理形成一个字符串

*来自: http://bbs.bccn.net/thread-472197-1-1.html
*思路:每一条规则的第一顺位字符都有可能会是即将形成的字符串的第一个字符,只要再确认一下该字符是否不属于其他任何规则的次顺位字符就可以输出它到屏幕。逐渐缩小规则的规模直到所有规则被"读尽"

*作者:Chauncy523@*************************/
// 根据二维数组求出字符串,通过ans指针返回数据
void fun(char array[][Len_rules], int len, char *ans) {
    printf("%d",len);
    char**Head=(char**)malloc(sizeof(char*)*len);/*保存每条规则中的第一个字母所在位置*/
    for(int i=0; i<len; i++)Head[i]=&array[i][0];

    char**End=(char**)malloc(sizeof(char*)*len);/*用于标记检查每条规则的使用情况*/
    for(int i=0; i<len; i++)End[i]=&array[i][Len_rules];

    int flag;/*指示当前是否从所有规则中跳出合适的字母作为首字符*/
    do {
        flag=0;
        for(int i=0; i<len; i++) {/*从Head[]中挑一个作为首字符*/
            if(Head[i]==End[i])continue;
            flag=2;
            for(int m=0; m<len&&flag==2; m++) {
                if(Head[m]==End[m])continue;
                for(char*n=Head[m]+1; n!=End[m]&&flag==2; n++) {
                    if(*n==*Head[i])flag=1;
                }
            }
            if(flag==2) {/*将找到的字符写入ans*/
                *ans=*Head[i];
                break;
            }
        }

        for(int i=0; i<len; i++) { /*消除所有刚刚找到并输出的首字符*/
            if(Head[i]==End[i])continue;
            if(*Head[i]==*ans)++Head[i];
        }printf("%d=flag",flag);
        printf("{%c ",*ans);
        for(int i=0; i<len; i++) {
            printf("(%d)",Head[i]-&array[i][0]);
        }
        printf("}\n");
        ans++;/*ans指向一个新的空位置,等待下一轮写入*/

    } while(flag!=0);
    *(ans-1)='\0';
}

int main() {
    char str[Len_str] = {0};
    char array[][Len_rules] = {{'t', 's', 'f'}, {'a', 's', 'u'}, {'m', 'a', 'f'}, {'a', 'i', 'n'}, {'s', 'u', 'n'}, {'m', 'f', 'u'},
        {'a', 't', 'h'}, {'t', 'h', 'i'}, {'h', 'i', 'f'}, {'m', 'h', 'f'}, {'a', 'u', 'n'}, {'m', 'a', 't'},
        {'f', 'u', 'n'}, {'h', 's', 'n'}, {'a', 'i', 's'}, {'m', 's', 'n'}, {'m', 's', 'u'}
    };
    fun(array, sizeof(array) / sizeof(array[0]), str);
    puts(str);   // mathisfun


    return 0;
}
方法应该是对的,不过算法复杂度蛮高的。思路应该是比较清晰,易于理解的吧。
如果不是为了修改array[][3]成array[][Len_rules],可能代码长度能再消掉不少。




[此贴子已经被作者于2016-12-25 13:01编辑过]


φ(゜▽゜*)♪
2016-12-25 12:59
dongdon923
Rank: 2
等 级:论坛游民
威 望:1
帖 子:17
专家分:58
注 册:2016-12-2
得分:0 
不太明白。但努力看了一边
2017-01-01 16:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-472197-1-1.html




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

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