标题:世界杯分组
只看楼主
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
结帖率:95.65%
已结贴  问题点数:20 回复次数:6 
世界杯分组
太久不写代码,都不知掉怎么写了,我感觉我要废掉了。
昨天写的迭代版本,应该很难看,花了好些时间改写成递归版本,现在应该会好看很多。
另外,只写了32强的分组,没有写32进16等等。

树画出来大致是这样的
                  阿根廷
         阿根廷             英格兰
     阿根廷   德国        日本     英格兰


程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define T League
typedef struct T *T;
#define TreeHeigh 5

char *Other[] = {"英格兰","意大利","葡萄牙","克罗地亚","土耳其","瑞典","捷克","塞尔维亚","加纳","科特迪瓦","突尼斯","尼日利亚","喀麦隆","日本","韩国","澳大利亚","伊朗","美国","墨西哥","哥斯达黎
","洪都拉斯","巴拉圭","智利","厄瓜多尔"};

char *Send[] = { "乌拉圭","西班牙","德国","阿根廷","荷兰","法国","巴西","俄罗斯"};
int F_Send[ 8 ];
int F_Other[ 24 ];

struct T{
    int Score;
    int Heigh;
    T Left;
    T Right;
    char *Name;
};

void
INIT( T *Root, int Heigh );

void
Print( T Root );


int
main( void )
{
    T Root;
    int heigh;

    heigh = 0;

    Root = NULL;
    INIT( &Root, heigh );
    Print( Root );


    return 0;
}




void
INIT( T *Root, int Heigh )
{
    int f;
    static int g = -1;

    srand( ( unsigned )time( NULL ) );
        

    if( NULL == *Root )
    {

        T new = ( T )malloc( sizeof( struct T ) );
        if( NULL == new )
            exit( EXIT_FAILURE );
        new->Left = NULL;
        new->Right = NULL;
        new->Name = NULL;
        new->Score = -1;
        new->Heigh = Heigh;
        *Root = new;
    }

    if( TreeHeigh == ( *Root )->Heigh )
    {

        ++g;
        if( 0 == g % 4 )
        {
            while( 1 )
            {        
                f = rand( ) % 8;
                if( 0 == F_Send[ f ] )
                {
                    ( *Root )->Name = Send[ f ];
                    F_Send[ f ] = 1;
                    break;
                }
            }
        }
        else
        {
            while( 1 )
            {
                f = rand() % 24;
                if( 0 == F_Other[ f ] )
                {
                    ( *Root )->Name = Other[ f ];
                    F_Other[ f ] = 1;
                    break;
                }
            }
        }

    }

    if( TreeHeigh == Heigh )
        return;

    INIT( &(*Root)->Left, Heigh + 1 );
    INIT( &(*Root)->Right, Heigh + 1 );
}

void
Print( T Root )
{
    static int g = 0;
    static char ch = 'A';

    if( NULL == Root )
        return;
    if( NULL != Root->Name )
    {
        if( 0 == g % 4 )
            printf( "%c\n", ch++);
        printf( "%s ", Root->Name );
        ++g;
        if( 0 == g % 2 )
            printf( "\n" );


    }
    Print( Root->Left );
    Print( Root->Right );
}




[此贴子已经被作者于2017-7-10 22:17编辑过]

搜索更多相关主题的帖子: int Name void Print NULL 
2017-07-10 19:13
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:20 
把国家名改成数字感觉这样会好看一点~表示对大量国家中文不敏感~个人感觉~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-07-10 19:41
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 2楼 九转星河
为什么要把国家名改成数字?
难道不是英文?

这也仅仅是一个示例,不过这个示例能够理解,那么32进16,16进8等等都不是问题。只要知道树的特性是怎样,不难写出代码。

这种树也用来查找最大值。

[此贴子已经被作者于2017-7-10 19:44编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-07-10 19:43
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 3楼 renkejun1942
这种树找最大值的一个算法可以叫归并排序~当然归并排序可以用数组实现的~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-07-10 19:50
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
回复 4楼 九转星河
归并排序是这样的吗?
不清楚了。排序方便我都还没看到那里去。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-07-10 19:53
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 5楼 renkejun1942
突然发现用树的一个方便之处是如果只取顶层数据下一轮可以释放上一轮的空间~当然这样没有必要开这么多个节点了~节点是可以重复利用的~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-07-11 07:29
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 4楼 九转星河
归并排序的合并方式是先把小区间部分排序完毕即时合并~而这个是把所有小区间整理完毕一起合并~多少还是有些出入的~当然这种树有点哈夫曼树的特征~哈夫曼树是根据使用频率(可以理解为权值)来决定该节点的深度位置~可以理解为加权的最短路径解~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-07-11 07:35



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




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

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