(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 }