hrbust 1587(Gragon Island)( 递归 )

刚开始看这道题时感觉有很多的嵌套,(试了其他的方法不行后来才决定用递归)那就是递归了。本题关键是找到递归的关键点。由于当遇到“()”时"()"里面很可能还有“()”说明“()”这个括号有文章。对就是在“(”这个地方递归。以前递归只接触过数学方面的和深搜一类的,这种类型的递归还没想过,看来学一样东西还是要灵活的用,而灵活的用只能是多做题了。

 1 #include<stdio.h>
 2 #include<string.h>
 3 
 4 void Change(int left, int right, char p[])//递归函数
 5 {
 6     for (int i=left; i<=right; i++)
 7     {
 8         if (p[i]>='a' && p[i]<='z')
 9         {
10             putchar(p[i]);
11             continue;
12         }
13         if (p[i]>='0' && p[i]<='9')//遇到数字的时候和遇到“(”时一样
14         {                                    //都是关键点。
15             int t = 0;
16             while (p[i]>='0' && p[i]<='9')
17             {
18                 t = t * 10 + p[i] - '0';
19                 i++;
20             }
21             int tt = 0;
22             int ll = i;//记录下次递归的开始(也就是“(”的位置)。
23             if (p[ll]=='(')
24                 {
25                     int k = 1;
26                     int j;
27                     ll = i+1;
28                     for (j=i+1; j<right; j++)//由于“()”里面
29                     {                                  //还有可能有“()”
30                          if (p[j] == '(')          //所以要判断匹配也就是
31                             {                        //找到最后一个“)”的位置。
32                                 k++;
33                             }
34                         else if (p[j] == ')')
35                             {
36                                 k--;
37                             }
38                         if (k == 0)
39                         {
40                             break;
41                         }
42                     }
43                     tt = j - 1;
44                     for (k=0; k<t; k++)//有t个递归。
45                     {
46                         Change(ll, tt, p);
47                     }
48                     i = j;
49                     continue;
50                 }
51             else
52                 {
53                     for (int k=0; k<t;k++)
54                     {
55                         putchar(p[i]);
56                     }
57                 }
58         }
59         else if (p[i]=='(' || p[i]==')')
60         {
61             continue;
62         }
63     }
64     return;
65 }
66 int main(void)
67 {
68     int t;
69     char dd[110];
70 
71     scanf("%d",&t);
72 
73     while (t--)
74     {
75         scanf("%s", dd);
76 
77         int len = strlen(dd);
78 
79         Change(0, len-1, dd);
80         putchar('\n');
81     }
82     return 0;
83 }

 

Gragon Island
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 4(3 users) Total Accepted: 3(3 users) Rating:  Special Judge: No
Description

传说在很久很久以前,江湖上流传着一个叫Gragon Island的地方,传说那个地方有神龙的存在,但是那个地方所处的位置十分偏僻,而且岛上阴森可怖,因此不曾有人涉足。

当时北方有一个叫 wd 的侠客,南方有一个叫Cc的侠女,他们几乎同时对这座岛产生了兴趣,于是他们商量好结伴而行,但是当他们相遇的时候,Cc突然想考验一下wd的能力,因为担心他会拖自己的后腿,于是她给wd出了个题目:

    她说一些语句,wd要立刻还原出来,语句的主要内容是由小写的英文字母组成,但是语句中可能会有一些连续相邻的但是相同的子串,Cc会把其中一些合并,例如:2nova)表示novanova2nova 表示 nnova 有些括号前可能是1,在这些情况之中有些是把1省略的,例如:nova = no(va) = no1(va)

    如果wd可以还原出原字符串,Cc就同意和他一起去Gragon Island,但是这却没有难倒wd,因为他带了个叫扣得不牢克的神器,通过它wd轻松的将语句还原了出来,于是他们踏上了前往目的地的旅程...

 


Input

多组测试数据,第一行一个整数T表示语句的数量,接着是T表述式表述式将按照上面介绍的规则书写,不会出现括号不匹配的情况,字符串的长度不会超过100.

Output

对于每组测试数据,输出还原之后的语句,每条语句占一行。

Sample Input

2

1(wind2m1d)

2(1tm2(ac))

Sample Output

windmmd

tmacactmacac

posted @ 2012-12-06 12:24  尔滨之夏  阅读(259)  评论(0编辑  收藏  举报