本来想用枚举法,生成所有的解,然后一一测试,但是超时了。所以只能用回溯法了,但是又要解决回溯时,字符串变量的状态不会回溯的问题
#include<iostream>
#include<string>
using namespace std;
string s[11];
string ss;
string ans;
string a[11];
bool vis[11];
void func(int cur,int n)
{
string str;
for(int i=0;i<cur;++i)
{
str+=a[i];//为了解决str不能回溯到之前的状态的问题,只能用数组存,然后要用的时候一个个加
}
ss.assign(ans.begin(),ans.begin()+str.size());
if(str<ss)
{
return;
}
if(cur == n)
{
ans = str;
return ;
}
else
{
for(int i=0;i<n;++i)
{
if(!vis[i])
{
a[cur] = s[i];
vis[i] = true;
func(cur+1,n);
vis[i] = false;
}
}
}
}
int main()
{
int n;
string str;
while(cin>>n)
{
ans.clear();
for(int i=0;i<n;++i)
{
cin>>s[i];
ans+=s[i];
}
func(0,n);
cout<<ans<<endl;
}
}