2. 公司里的那点事儿(10分)

成绩10开启时间2018年11月20日 星期二 18:00
折扣0.8折扣时间2018年12月10日 星期一 23:55
允许迟交关闭时间2018年12月20日 星期四 23:55

描述

对于一间公司来说,它成立之时所做的第一件事恐怕就是任命CEO了。之后,CEO就会开始雇用员工,也会有员工离职去别的公司。假设公司中的每一个员工(包括 CEO在内)都可以直接雇用新的员工,而公司中的所有员工(包括CEO)也都可能会跳槽离开,则某公司在成立一段时间之后的的组织结构如图1:

图1

图1

VonNeumann是公司的CEO,他直接雇用了两个人,分别是Tanenbaum和Dijkstra。在公司中,某员工的几个直接下属,他们的职位是由员工们的工龄决定的,在图中即表现为从从左至右职位越来越低,譬如Tanenbaum的职位就比Dijkstra要高。

当一个员工雇用了新的下属时,该下属在该员工雇佣的所有下属中,职位是最低的。假设VonNeumann又雇用了Shannon,则VonNeumann的三名下属职位从高到低分别是Tanenbaum、Dijkstra和Shannon。

当公司中的员工离职,则有两种情况。若他没有雇用任何下属,则他会被从公司的组织结构中拿掉。若他有直接的下属,则他的直接下属中职位较高的人,会升职并补上缺位。而该下属若也有下属,则他的下属中职位最高的,会补上他升值后空出的位子。以此类推,直到某个尚未雇用下属的员工升职。

假设图1中的Tanenbaum跳槽离开了,则Stallings会补上它的位置,而Knuth会补上Stallings的位置。图2展示了变化后的结果:(1) VonNeumann雇用了Shannon,(2) Tanenbaum跳槽。

图2

图2

输入

输入的第一行是 CEO 的姓名。题目中所有的人名的长度都在2-20之间,且由大小写字母、数字和短线(减号)组成。每个名字都包含至少一个大写和一个小写字母。

在第一行后会有很多行内容,他们由如下的规则构成:

  • [老员工] hires [新员工]
  • fire [老员工]
  • print

[老员工] 是已经在公司工作的人的名字,而[新员工]是即将被雇用的员工的名字。以上三种规则组成的内容可能会按照任何顺序出现。但公司中会至少有一名员工(CEO),且公司的规模最大不会超过 1000 人。

输出

对于每一个打印命令,按照如下规则输出当前公司的结构信息:

  • 每一行包含一个人名
  • 第一行是CEO的名字,从第一列开始
  • 图3形式的结果,

    图3

    图3

    会输出为图4

    图4

    图4

  • 在每次print之后,输出一行60个字符的减号,整个输出中没有任何空行。
 测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助
测试用例 1以文本方式显示
  1. VonNeumann↵
  2. VonNeumann hires Tanenbaum↵
  3. VonNeumann hires Dijkstra↵
  4. Tanenbaum hires Stallings↵
  5. Tanenbaum hires Silberschatz↵
  6. Stallings hires Knuth↵
  7. Stallings hires Hamming↵
  8. Stallings hires Huffman↵
  9. print↵
  10. VonNeumann hires Shannon↵
  11. fire Tanenbaum↵
  12. print↵
  13. fire Silberschatz↵
  14. fire VonNeumann↵
  15. print↵
以文本方式显示
  1. VonNeumann↵
  2. +Tanenbaum↵
  3. ++Stallings↵
  4. +++Knuth↵
  5. +++Hamming↵
  6. +++Huffman↵
  7. ++Silberschatz↵
  8. +Dijkstra↵
  9. ------------------------------------------------------------↵
  10. VonNeumann↵
  11. +Stallings↵
  12. ++Knuth↵
  13. +++Hamming↵
  14. +++Huffman↵
  15. ++Silberschatz↵
  16. +Dijkstra↵
  17. +Shannon↵
  18. ------------------------------------------------------------↵
  19. Stallings↵
  20. +Knuth↵
  21. ++Hamming↵
  22. +++Huffman↵
  23. +Dijkstra↵
  24. +Shannon↵
  25. ------------------------------------------------------------↵
1秒64M0

 

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

typedef struct node{
    char name[20];
    int rank;
    struct node *fchild;
    struct node *nextsibling;
}NODE;
NODE *CEO;

typedef struct node2{
    int rank;
    struct node *position;
}NODE2;
NODE2 judge[100];

int cmp(const void *a, const void *b)
{
    return  (*(NODE2 *)b).rank - (*(NODE2 *)a).rank;
}

char employer[20], employee[20];

void UpdateRank(NODE *p){
    if(p != NULL){
        p->rank++;
        UpdateRank(p->fchild);
        UpdateRank(p->nextsibling);
    }
    return;
}

int Hire(NODE *p){
    if(p != NULL){
        if(!strcmp(p->name, employer)){
            if(p->fchild == NULL){
                p->fchild = (NODE*)malloc(sizeof(NODE));
                p->fchild->rank = 0;
                memset(p->fchild->name, '\0', 20);
                strcpy(p->fchild->name, employee);
                p->fchild->fchild = NULL;
                p->fchild->nextsibling = NULL;
                return 1;
            }
            else{
                p = p->fchild;
                while(p->nextsibling != NULL){
                    p = p->nextsibling;
                }
                p->nextsibling = (NODE*)malloc(sizeof(NODE));;
                p->nextsibling->rank = 0;
                memset(p->nextsibling->name, '\0', 20);
                strcpy(p->nextsibling->name, employee);
                p->nextsibling->fchild = NULL;
                p->nextsibling->nextsibling = NULL;
                return 1;
            }
        }
        else{
            if(Hire(p->nextsibling)) return 1;
            if(Hire(p->fchild)) return 1;
            return 0;
        }
    }
    else return 0;
    
}

NODE *boss, *fired;

int Search(NODE *root){
    NODE *p = root->fchild;
    while(p != NULL){
        if(!strcmp(p->name, employee)){
            boss = root;
            fired = p;
            return 1;
        }
        else{
            p = p->nextsibling;
        }
    }
    p = root->fchild;
    while(p != NULL){
        if(Search(p)) return 1;
        p = p->nextsibling;
    }
    return 0;
}

void Pop(NODE *blank){
    if(blank->fchild->fchild == NULL){
        memset(blank->name, '\0', 20);
        strcpy(blank->name, blank->fchild->name);
        blank->fchild = blank->fchild->nextsibling;
        return ;
    }
    memset(blank->name, '\0', 20);
    strcpy(blank->name, blank->fchild->name);
    Pop(blank->fchild);
}

void Fire(NODE *p){
    if(fired->fchild == NULL){
        if(boss->fchild == fired){
            boss->fchild = boss->fchild->nextsibling;
            return;
        }
        else{
            NODE *p = boss->fchild;
            while(p->nextsibling != fired){
                p = p->nextsibling;
            }
            p->nextsibling = p->nextsibling->nextsibling;
        }
    }
    else{
        Pop(fired);

    }
    
}

int count = 0;



void Print(NODE *ptr,int dep)
{
	if(ptr!=NULL)
	{
		for(int i=0;i<dep;i++)
			printf("+");
		printf("%s\n",ptr->name);
	}
	if(ptr->fchild!=NULL)
		Print(ptr->fchild,dep+1);
	if(ptr->nextsibling!=NULL)
		Print(ptr->nextsibling,dep);	
}

NODE *root;

int main(int argc, char const *argv[])
{
    char name[20], operate[20], print[20], fire[20];
    memset(fire, '\0', 20);
    memset(print, '\0', 20);
    strcpy(fire, "fire");
    strcpy(print, "print");
    //建立CEO
    CEO = (NODE*)malloc(sizeof(NODE));
    scanf("%s",name);
    memset(CEO->name, '\0', 20);
    strcpy(CEO->name, name);
    CEO->rank = 0;
    CEO->fchild = NULL;
    CEO->nextsibling = NULL;
    root = (NODE*)malloc(sizeof(NODE));
    root->fchild = CEO;
    root->nextsibling = NULL;

    //建立公司
    memset(operate, '\0', 20);
    while(scanf("%s",operate) != EOF){
        //print操作
        if(!strcmp(operate, print)){
            Print(root->fchild, 0);
            printf("------------------------------------------------------------\n");
            //Judge();
        }
        //fire操作
        else if(!strcmp(operate, fire)){
            memset(employer, '\0', 20);
            memset(employee, '\0', 20);
            scanf("%s", employee);
            Search(root);
            Fire(boss);
            //Judge();
            
        }
        //hire操作
        else{
            UpdateRank(CEO);
            memset(employer, '\0', 20);
            memset(employee, '\0', 20);
            strcpy(employer, operate);
            scanf("%s", operate);
            scanf("%s", employee);
            Hire(CEO);
        }
    }


    return 0;
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值