zoukankan      html  css  js  c++  java
  • 寒假Day30:HDU1274展开字符串dfs

    题面:

    在纺织CAD系统开发过程中,经常会遇到纱线排列的问题。
    该问题的描述是这样的:常用纱线的品种一般不会超过25种,所以分别可以用小写字母表示不同的纱线,例如:abc表示三根纱线的排列;重复可以用数字和括号表示,例如:2(abc)表示abcabc;1(a)=1a表示a;2ab表示aab;如果括号前面没有表示重复的数字出现,则就可认为是1被省略了,如:cd(abc)=cd1(abc)=cdabc;这种表示方法非常简单紧凑,也易于理解;但是计算机却不能理解。为了使计算机接受,就必须将简单紧凑的表达方式展开。某ACM队接受了此项任务。现在你就是该ACM队的一员,请你把这个程序编写完成。
    已知条件:输入的简单紧凑表达方式的长度不超过250个字符;括号前表示重复的数不超过1000;不会出现除了数字、括号、小写字母以外的任何其他字符;不会出现括号不配对等错误的情况(错误处理已由ACM其他队员完成了)。
    Input
    本题有多个测试数据组,第一行输入的就是数据组数N,接着就是N行表达式,表达式是按照前面介绍的意义书写的。
    Output
    输出时含有N行,每行对应一个输入的表达式。
    View Code

    测试样例:

    Sample Input
    2
    1(1a2b1(ab)1c)
    3(ab2(4ab))
    
    Sample Output
    abbabc
    abaaaabaaaababaaaabaaaababaaaabaaaab

    思路:

    可以用栈模拟。不过容易出错。

    建议:dfs,但是不怎么好写叭,我今天理解了好久才能算勉强理解,感觉有些地方还需要理解一下

    遍历整个字符串,判断每个字符:

    如果是数字字符,for循环判断数字有多大

    数字后面没有括号,则循环输出字符

    数字后面有“(  ”,利用dfs循环输出括号内的字符

    #include<stdio.h>
    #include<algorithm>
    #include<iostream>
    #include<string.h>
    using namespace std;
    typedef long long ll;
    
    char a[300];
    int len;
    
    int dfs(int i)
    {
        char ch;
        for(ch=a[i++]; i<len; ch=a[i++])
        {
            if(ch==')')
                break;
            int sum=0;
            for(; ; ch=a[i++])
            {
                if(ch>='0'&&ch<='9')
                    sum=sum*10+ch-'0';
                else
                    break;
            }
    //        while(1)
    //        {
    //            if(ch>='0'&&ch<='9')
    //                sum=sum*10+ch-'0',i++;
    //            else
    //                break;
    //        }    //TLE
            if(sum==0)
                sum=1;
            if(ch=='(')
            {
                int t;
                while(sum--)//通过sum次递归把字符串的重复次数输出
                    t=dfs(i);//如果有括号,先求解括号里面的
                i=t;//记录递归出来后的位置
    
            }
            else//如果数字后面跟的直接是字符的话,就循环输出该字符
            {
                while(sum--)
                    printf("%c",ch);
            }
        }
        if(ch==')')
            return i;//返回位置 )在10的位置,返回11,返回dfs会自动-1
    }
    
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%s",a);
            len=strlen(a);
            dfs(0);
            printf("\n");
        }
        return 0;
    }
  • 相关阅读:
    大数据之路Week10_day01 (练习:通过设计rowkey来实现查询需求)
    大数据之路Week10_day01 (通过直接创建Hfile文件的方式往Hbase中插入数据)
    大数据之路Week10_day01 (Hbase总结 II)
    Week09_day05(Java API操作Hbase)
    Week09_day05(Hbase的基本使用)
    Zookeeper、Hadoop、Hbase的启动顺序以及关闭顺序
    Week09_day05(Hbase的安装搭建)
    HDU 1198
    hdu 1250 Hat's Fibonacci(java,简单,大数)
    HDU 1316 How Many Fibs?(java,简单题,大数)
  • 原文地址:https://www.cnblogs.com/OFSHK/p/12319099.html
Copyright © 2011-2022 走看看