1:物质分解记录

总时间限制: 
60000ms 
内存限制: 
131064kB
描述

对 物质分解记录 的结构进行统计分析。
例如:
给出一份 物质分解记录。
Material_1
{
Material_2
{
Material_3
                Material_4
Material_5
                {
                Material_6
                Material_7
                }
                Material_8
}
Material_9
Material_10
}
Material_11
{
Material_l3
Material_7
Material_2
{
Material_3
                Material_4
Material_5
                {
             Material_6
             Material_7
                }
                Material_8
}
Material_13
}

上述记录的含义是,Material_1分解为 Material_2、Material_9和Material_10,Material_2又分解为Material_3、Material_4、Material_5和Material_8。以此类推,大括号外书写特定物质名称,括号内表示此特定物质分解出来的子物质名称,每个子物质还可再分解。

现输入一个物质名称R,要求输出所有和物质R在记录中属于同一层次且位置在R之后的物质名称。
比如R=“Material_1” ,则应该输出“Material_11”;
比如R=“Material_9” ,则应该输出“Material_10”
如果R在代码中出现了多次,则以其第一次出现为准,即仅输出与第一次出现的R属于同一层次且位置在R之后的语句内容。
比如R=“Material_2” ,则应该输出
        Material_9
Material_10

输入
输入包含多组数据。第一行是物质分解记录的份数,仅用一个整数表示。从第二行开始,每组数据包括 物质分解记录 和 所需查找的物质R 两部分,物质分解记录样式如描述中所示,R的内容和物质分解记录之间有一行空行,下一份记录与上一个R之间有两行空行。
若输入!则表示输入结束。
为简单起见,物质分解记录中每一行的内容为“{”或者“}”或者一个物质名称,不会有其他情况(比如空行)出现。同时每行文字前不会有任何缩进。物质名称是英文字母、数字和下划线组成的字符串。
输出
对每组数据输出一行,如果R在记录中找到,则输出所有与R在同一层次且位置在R之后的物质名称,名称之间无需添加空格,紧密连接即可;否则输出No。若R是其所在层次中最后一个物质,则输出"",即输出一个空字符。
样例输入
3
Material_1
{
Material_2
{
Material_3
Material_4
Material_5
{
Material_6
Material_7
}
Material_8
}
Material_9
Material_10
}

Material_2


Material_1
{
Material_2
{
Material_3
Material_4
Material_5
{
Material_6
Material_7
}
Material_8
}
Material_9
Material_10
}
Material_11
{
Material_3
Material_7
Material_2
{
Material_3
Material_4
Material_5
{
Material_6
Material_7
}
Material_8
}
Material_13
}

Material_2


Material_1
{
Material_2
{
Material_3
Material_4
Material_5
{
Material_6
Material_7
}
Material_8
}
Material_9
Material_10
}

Material_20


!
样例输出
Material_9Material_10
Material_9Material_10
No
提示
读入数据时,需采用如下方式进行读取。
例:若要读取一行输入内容,则
cin.getline(line, lineSize, '\n');
sscanf(line, "%s", tmp);

其中line和tmp为数组指针,类型为char* ,linesize为line所指向的数组的规模,为int型。
所需读取的内容最终是存储在tmp数组中。之后如需对读取的内容进行操作,就对tmp进行操作即可,读到空行时tmp长度即为0。

采用其他方法读取可能会出现WA以及RE,TLE。


这题这题我仅仅是把他做出来了而已。

曾近的想法是用,左子右兄的做法。但是不会写。

过程是这样。

先一直创建兄弟,如果有儿子的话 就递归进入下一层,等到遇到'}'则返回上一层。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<assert.h>
#include<ctype.h>
#include<stdlib.h>
#include<stack>
using namespace std;
struct node
{
    char name[300];
} T[1000];
int main()
{
    int t;
    scanf("%d",&t);
    cin.get();
    while(t--)
    {
        char mubiao[300];
        char tmp[400];

        int cnt=0;
        while(1)
        {
            cin.getline(tmp, 300);
            int len = strlen(tmp);
            if(len == 0)break;
            //printf("%s____a_%d___\n",tmp,strlen(tmp));
            tmp[strlen(tmp)] = '\0';
            strcpy(T[cnt++].name,tmp);
        }
        cin.getline(mubiao,300);
        //for(int i =0;i<cnt;i++)
       // printf("%s^^^^^%d*ds\n",T[i].name,i);
        bool hadfind = false;
        int xiabiao;
        for(int i =0; i<cnt; i++)
        {
            if( !strcmp(mubiao,T[i].name))
            {
                hadfind = true;
                xiabiao = i;
                break;
            }
        }
        stack<char>S;
       // printf("%d\n",xiabiao);
        if(hadfind)
            for(int i=xiabiao+1; i<cnt; i++)
            {
                if(S.empty()&&T[i].name[0]=='}')
                {
                    break;
                }
                else if(T[i].name[0]=='{')
                {
                    S.push(T[i].name[0]);
                    //printf("%d______+++\n",i);
                }
                else  if(T[i].name[0]=='}')S.pop();
                else  if(S.empty())printf("%s",T[i].name);
            }
        else
            printf("No");

        printf("\n");
        cin.get();
        cin.get();
    }
    getchar();
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值