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

这组数据
程序代码:
4
d e f
a b c
b d e
c d f
abcdef


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



[fly]存在即是合理[/fly]
2016-12-12 11:57
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
以下是引用azzbcc在2016-12-12 11:56:56的发言:

你测试的这组数据
c的位置不确定啊~怎么做???

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-12 12:30
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:0 
回复 13楼 azzbcc
你这组数据条件不充分,不能说明c和d的关系。
关于7楼代码bug见我在8楼代码后面的补充:“发现7楼代码一个小瑕疵,尽管这个bug永远不会造成危害...”,我只是没仔细想怎么用数据验证,其危害还是超出我的预计了。按8楼后面的补充修改,你12楼数据通过。
2016-12-12 12:30
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
得分:0 
回复 10楼 xzlxzlxzl
确实要去掉。
2016-12-12 12:50
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
回复 11楼 九转星河
201612121403

测试方法有问题,已修复


还是说明一下,你的strchr操作的结果并不是确定的,

测试中出现的问题是因为访问了超出范围的数据,ps 指向了二维数组之外的地址

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



[fly]存在即是合理[/fly]
2016-12-12 13:25
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
经两位版主提醒,数据已做修改,已经重新回复


[fly]存在即是合理[/fly]
2016-12-12 13:39
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 18楼 azzbcc
改用memchr访问~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-12 16:34
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
恩,最终版本放在这里了

程序代码:
#include "fun.h"

// 最终字符串长度
int getLength(char array[][3], int len)
{
    int num = 0;
    bool flags[CHAR_MAX] = {false};

    for (int i = 0; i < len; ++i)
    {
        flags[array[i][0]] = true;
        flags[array[i][1]] = true;
        flags[array[i][2]] = true;
    }
    for (int i = 0; i < CHAR_MAX; ++i)
    {
        if (flags[i]) num++;
    }
    return num;
}

// 判断array后两列是否包含字符ch
bool isIn(char ch, char array[][3], int len)
{
    for (int i = 0; i < len; ++i)
    {
        if (ch == array[i][1]) return true;
        if (ch == array[i][2]) return true;
    }
}

// 获取第一个字符
char findFirst(char array[][3], int len)
{
    for (int i = 0; i < len; ++i)
    {
        if (!isIn(array[i][0], array, len)) return array[i][0];
    }
    return -1;
}

// 从数组中删除ch,并前移其他项
void change(char ch, char array[][3], int len)
{
    for (int i = 0; i < len; ++i)
    {
        if (ch == array[i][0])
        {
            array[i][0] = array[i][1], array[i][1] = array[i][2], array[i][2] = -1;
        }
        if (ch == array[i][1])
        {
            array[i][1] = array[i][2], array[i][2] = -1;
        }
        if (ch == array[i][2])
        {
            array[i][2] = -1;
        }
    }
}

void fun(char array[][3], int len, char *str)
{
    int ans_len = getLength(array, len);

    for (int i = 0; i < ans_len; ++i)
    {
        str[i] = findFirst(array, len);

        change(str[i], array, len);
    }
    str[ans_len] = '\0';
}


[fly]存在即是合理[/fly]
2016-12-12 17:04
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
这里数据不够全,新的数据放在首页了


把项目放在这里,有兴趣的同学可以自己测试
test.zip (4.8 KB)


[此贴子已经被作者于2016-12-14 10:14编辑过]

收到的鲜花
  • 九转星河2016-12-12 19:48 送鲜花  10朵   附言:好文章


[fly]存在即是合理[/fly]
2016-12-12 17:21
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:0 
得票最多的算法,简直想撞墙

程序代码:
#include "fun.h"

void getString(char array[][3], int len, char *str)
{
    int pos = 0;
    bool flags[CHAR_MAX] = {false};

    for (int i = 0; i < len; ++i)
    {
        flags[array[i][0]] = true;
        flags[array[i][1]] = true;
        flags[array[i][2]] = true;
    }
    for (int i = 0; i < CHAR_MAX; ++i)
    {
        if (flags[i]) str[pos++] = (char) i;
    }
    str[pos] = '\0';
}

void change(char *p1, char *p2)
{
    char tmp = *p1;
    while (p1 < p2)
    {
        *p1 = *(p1 + 1);
        p1++;
    }
    *p2 = tmp;
}

bool fix(char array[][3], int len, char *str)
{
    for (int i = 0; i < len; ++i)
    {
        char *p1 = strchr(str, array[i][0]);
        char *p2 = strchr(str, array[i][1]);
        char *p3 = strchr(str, array[i][2]);

        if (p2 > p3)
        {
            change(p3, p2);
            return true;
        }

        if (p1 > p2)
        {
            change(p2, p1);
            return true;
        }
    }

    return false;
}

void fun(char array[][3], int len, char *str)
{
    getString(array, len, str);

    while (fix(array, len, str));
}


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



[fly]存在即是合理[/fly]
2016-12-12 18:04



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




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

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