题目大意:

根据所给的数字,表示其相连的字符的输出个数,或是下一个括号中的所有字符的输出个数

每一个相互对应的 '(' 和 ')' 中的所有字母均作为一组数据处理

在每一次dfs过程中都处理好这样一个对应组中间的字符

再根据前面所带的数字k

循环k次输出自己要的数据

 

每次输出一个字母,因为无论多复杂的字符串都能够转化成最后只带一个数字和一个字母连接的形式,第38行代码有较详细解释

 

 1 #include <cstring>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 const int N = 255;
 7 char str[N];
 8 int len;//表示str字符串的长度
 9 /*将一组'('')'看作一次递归,而数字看作递归调用的次数*/
10 int dfs(int index)
11 {
12     int k , i;//k来表示前面标志的数字
13     /*一直到找到它对应的')'表示自己这一次递归打印结束*/
14     for(i = index ; i<len && str[i] != ')' ; i++){
15         k = 0;
16         /*利用下面这个循环获得打印字母次数的k*/
17         while(str[i] - '0' >= 0 && str[i] - '0' <= 9){
18             //不是数字就退出循环
19             k = k * 10 + (str[i] - '0') ;
20             i++; //这里每成功访问到一个数字,那么为了访问下一个str[i]代表字母,就要不断往前加一
21         }
22         if(k == 0) k = 1; //表示前面没有数字表示,就默认为1
23 
24         if(str[i] == '(')
25         {
26             int e;
27             /*因为后面不断putchar打印字母,这里每调用一次dfs,
28             就会把当前'('出发到对应')'结束的所有字母打印一遍,所以要调用k次打印k遍*/
29             while(k--)
30         /*因为你要继续接下来的操作,不能只传入i,因为str[i]对应的是括号,我们需从下一个点访问起,所以i++*/
31                 e = dfs(i+1);
32 
33             /*因为通过dfs会打印好所有( )中的字母,所以这里不用再管了,
34             下标移到执行完的e的位置,继续接下来的循环*/
35             i = e;
36         }
37         else{
38             /*因为最后无论字符串如何复杂都会转化成一个个一个数字连接一个字母的情况
39             如3(a),经过递归调用后也产生的是在if(str[i] == '(')调用3次
40             打印a , 这个a可以理解为1a,最后这个1a就进入了这个else中在
41             while中打印1次 , 又比如2a3bcd就能够理解为先打印了2a再下次进入
42             打印3b,再下一次1c,最后一次打印1d
43             */
44             while(k--)
45                 putchar(str[i]);
46         }
47     }
48     if(i < len) return i; //返回它的结束的括号位置的序号
49     else return len; //返回最后一个位置,表示所有都完成,不再继续递归
50 }
51 
52 int main()
53 {
54     //freopen("a.in" , "r" , stdin);
55     int T;
56     scanf("%d" , &T);
57     while(T--){
58         scanf("%s" , str);
59         len = strlen(str);
60         dfs(0);
61         puts("");
62     }
63     return 0;
64 }

 

 posted on 2014-12-24 00:37  Love风吟  阅读(192)  评论(0编辑  收藏  举报