zoukankan      html  css  js  c++  java
  • 家谱(东方化改题+破代码)

    啊啊好不容易才在贴吧上翻到这两张图……

    家谱(gen)

    题目描述

    守矢神社的早苗对于本家族血统总是记不住,现在给出充足的父子关系,请你编写程序找到她

    家族中某个人的最早的祖先。

    输入

    多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系由二行组成,用#name 的

    形式描写一组父子关系中的父亲的名字,用+name 的形式描写一组父子关系中的儿子的名字;

    接下来用?name 的形式表示要求该人的最早的祖先;最后用单独的一个$表示文件结束。规定

    每个人的名字都有且只有6 个字符,而且首字母大写,且没有任意两个人的名字相同。最多可

    能有1000 组父子关系,总人数最多可能达到50000 人,家谱中的记载不超过30 代。

    输出

    求出每一个要找祖先的人的祖先,格式:本人的名字+一个空格+祖先的名字+回车。

    我的题解能得60分(

     1 /*
     2     写代码人:zx
     3     批注人:zx 
     4     指导老师:gg
     5     我真菜,真的/ 
     6 */
     7 #include<cstdio>
     8 #include<cstring>
     9 using namespace std;
    10 char mz[50005][8];
    11 int fa[50005];
    12 int getf(int v)
    13 {
    14     if(fa[v] == 0)    return v;
    15     else{
    16         return fa[v] = getf(fa[v]);
    17     }
    18 }
    19 int main()
    20 {
    21     freopen("gen.in","r",stdin);
    22     freopen("gen.out","w",stdout);
    23     char c;
    24     int t = 0;
    25     char s1[7],s2[7],s[7];
    26     bool bb = true;
    27     bool bb2;
    28     while(1){
    29         if(bb)    gets(s);
    30         bb = true;
    31         if(s[0] == '$')    break;
    32         if(s[0] == '#'){
    33             s[0] = '0';
    34             strcpy(s1,s);
    35             if(t == 0){
    36                 t++;
    37                 strcpy(mz[t],s1);
    38             }
    39             while(1){
    40                 gets(s2);
    41                 if(s2[0] == '+'){
    42                     s2[0] = '0';
    43                     t++;
    44                     strcpy(mz[t],s2);
    45                     bb2 = true;
    46                     s1[0] = '0';
    47                     for(int i = 1;i < t;i++){
    48                         if(strcmp(mz[i],s1) == 0){
    49                             fa[t] = i;
    50                             bb2 = false;
    51                             break;
    52                         }
    53                     }
    54                     if(bb2){
    55                         fa[t] = t + 1;
    56                         t++;
    57                         strcpy(mz[t],s1);
    58                     }
    59                 }
    60                 else{
    61                     bb = false;
    62                     strcpy(s,s2);
    63                     break;
    64                 }
    65             }
    66             
    67         }
    68         if(s[0] == '?'){
    69             s[0] = '0';
    70             for(int i = 1;i <= t;i++){
    71                 if(strcmp(mz[i],s) == 0){
    72                     for(int j = 1;j <= 6;j++)    printf("%c",s[j]);
    73                     printf(" ");
    74                     for(int j = 1;j <= 6;j++)    printf("%c",mz[getf(i)][j]);
    75                     printf("
    ");
    76                     break;
    77                 }
    78             }
    79         }
    80     }
    81     return 0;
    82 }
  • 相关阅读:
    htnl5中设置文本单行显示,超出部分打省略号,鼠标移到文本时alt出全部文本内容
    sql 查出一张表中重复的所有记录数据
    JS实现关闭当前子窗口,刷新父窗口
    jstl <c:forEach> 介绍
    Oracle SQL: TO_CHAR and TO_NUMBER 笔记
    Python学习记录七---继承、多态和封装
    iOS动画和第三方插件学习网址
    Python学习记录(六)--函数 定义和使用
    python学习记录(五) --语句块和比较符
    Python学习记录(四)--字典
  • 原文地址:https://www.cnblogs.com/aristocrat/p/8906372.html
Copyright © 2011-2022 走看看