就是构造能相匹配的括号串,即每一个左括号都能找到对应的右括号匹配
)( 像这样的就不行
很快啊,我就一个搜索写了上去,不出意料T了
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
inline int read(){
int s=0,w=1;
char ch=cin.get();
while(!isalnum(ch)){if(ch=='-')w=-1;ch=cin.get();}
while(isdigit(ch)) s=s*10+ch-'0',ch=cin.get();
return s*w;
}
int cnt;
inline void dfs(string s,int num)
{
if(cnt==n||num<0||s.size()>2*n)
return ;
if(s.size()==n*2&&num==0)
{
cout<<s<<endl;
cnt++;
}
dfs(s+'(',num+1);
dfs(s+')',num-1);
}
signed main()
{
cout<<fixed<<setprecision(0);
ios::sync_with_stdio(false);
cin.tie(0);
int T=read();
while(T--)
{
cnt=0;
n=read();
dfs("(",1);
}
return 0;
}
还好我早有准备,用这个打个表看看
这不就是相当于一个括号向左向右挪动吗,简单写出即可
#include<bits/stdc++.h>
#define int long long
#define Endl '\n'
#define endl '\n'
#define x first
#define y second
#define pi pair<int ,int>
#define pb push_back
using namespace std;
inline int read(){
int s=0,w=1;
char ch=cin.get();
while(!isalnum(ch)){if(ch=='-')w=-1;ch=cin.get();}
while(isdigit(ch)) s=s*10+ch-'0',ch=cin.get();
return s*w;
}
signed main()
{
cout<<fixed<<setprecision(0);
ios::sync_with_stdio(false);
cin.tie(0);
int T=read();
next: while(T--)
{
int n=read();
string s;
int cnt=0;
for(int i=0;i<n;i++)
s+='(';
for(int i=0;i<n;i++)
s+=')';
cout<<s<<endl;
string cp=s;
for(int i=1;i<n;i++)
{
swap(s[n-1-i],s[n-i]);
swap(s[n+1-i],s[n-i]);
cnt++;
cout<<s<<endl;
if(cnt==n*2)
goto next;
swap(cp[n-1+i],cp[n+i]);
swap(cp[n+1+i],cp[n+i]);
cnt++;
}
}
return 0;
}