递归:codevs 1251 括号

codevs 1251 括号

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
题目描述 Description

计算乘法时,我们可以添加括号,来改变相乘的顺序,比如计算X1, X2, X3, X4, …, XN的积,可以

(X1(X2(X3(X4(...(XN-1*XN)...)))))

:::

:::

(((...(((X1*X2)X3)X4)...)XN-1)XN)

你的任务是编程求出所有这样的添括号的方案。

输入描述 Input Description

输入文件第一行是一个数n(1<=n<=10),表示有n个变量,之后N行每行一个变量的名字。

输出描述 Output Description

输出所有的添加括号的方案。注意:单个字符不要加括号,两个字符相乘中间要有乘号。

样例输入 Sample Input

4

North 

South 

East 

West

样例输出 Sample Output

(North(South(East*West)))

(North((South*East)West))

((North*South)(East*West))

((North(South*East))West)

(((North*South)East)West)

 1 /*不要尝试从样例数据的输出中寻找什么规律,事实上就是把这些字符串的前几个组合后几个组合(因为每个组合会有多种情况,所以返回的是字符串数组),再把两个的合并,那么就枚举前后组合的长度,边界,一个字符串,直接返回,两个字符串,中间加乘号,两边加括号返回*/
 2 #include<iostream>
 3 using namespace std;
 4 #include<cstdio>
 5 #include<vector>
 6 vector<string> dfs(string *ss,int begin,int end)
 7 {
 8     vector<string> ret;
 9     if(begin>end) return ret;
10     if(begin==end)
11     {
12         ret.push_back(ss[begin]);
13         return ret;
14     }
15     if(begin+1==end)
16     {
17         string s='('+ss[begin]+'*'+ss[end]+')';
18         ret.push_back(s);
19         return ret;
20     }
21     int size1,size2;
22     for(int i=begin;i<end;++i)
23     {
24         vector<string> s1=dfs(ss,begin,i);
25         vector<string> s2=dfs(ss,i+1,end);
26         size1=s1.size();size2=s2.size();
27         for(int j=0;j<size1;++j)
28           for(int k=0;k<size2;++k)
29           {
30               string s='('+s1[j]+s2[k]+')';/*注意这个中间没有乘号,因为题目中的括号与括号之间没有乘号的*/
31               ret.push_back(s);
32           }
33     }
34     return ret;
35 }
36 int main()
37 {
38     string ss[15];
39     int n;
40     scanf("%d",&n);
41     for(int i=1;i<=n;++i)
42       cin>>ss[i];
43     vector<string>ans=dfs(ss,1,n);
44     int size=ans.size();
45     for(int i=0;i<size;++i)
46       cout<<ans[i]<<endl;
47     return 0;
48 }

 

posted @ 2016-06-12 09:19  csgc0131123  阅读(237)  评论(0编辑  收藏  举报