//发现dfs除了搜索功能外的其他功能,他本身是一种序列,这个题恰是“先序”的下一个(合法范围内)序列!
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct state
{
string s;
int sum_0;
int sum_1;
};
vector<state>v;
bool flag;
void dfs(int cur,state ss,int size,string xulie)
{
if(cur%2==0) //剪枝一:一旦发现小了,马上回溯!
{
string temp1(xulie,0,cur-1);//只比前cur个字符
if(ss.s<temp1)
{
return;
}
}
if(flag==1)return;
if(cur==size) //一次获得即可返回,DFS序列本可以是字典序!
{
if(ss.sum_0==ss.sum_1&&ss.s>xulie)
{ v.push_back(ss);flag=1;}
}
else
{
if(ss.sum_0<=size/2)
{
state temp_ss(ss); //只建立临时对象传递下去!
temp_ss.sum_0=ss.sum_0+1;temp_ss.s=ss.s+"0";
dfs(cur+1,temp_ss,size,xulie);
}
if(ss.sum_1+1<=ss.sum_0)
{
state temp_ss(ss);
temp_ss.sum_1=ss.sum_1+1;temp_ss.s=ss.s+"1";
dfs(cur+1,temp_ss,size,xulie);
}
}
}
int main()
{ string xulie;
while(cin>>xulie)
{
v.clear();
flag=0;
state ss;
ss.s="0";ss.sum_0=1;ss.sum_1=0;
for(int i=0;i<xulie.size();i++)
{
if(xulie[i]=='(')
xulie[i]='0';
else
xulie[i]='1';
}
dfs(1,ss,xulie.size(),xulie);
if(!v.empty())
{
string temp2;
for(int i=0;i<v[0].s.size();i++)
{
if((v[0].s)[i]=='0')
temp2+='(';
else
temp2+=')';
}
cout<<temp2<<endl;
}
else cout<<"No solution"<<endl;
}
}
sgu179 SGU起航!
最新推荐文章于 2018-10-15 21:31:00 发布