这都是之前第七章留下来的水题。
枚举全排列。然后挨个求就可以了。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
#include <string>
#include <algorithm>
#define MAXN 30
#define MOD 1000000007
#define INF 2139062143
#define ll long long
using namespace std;
int main()
{
std::ios::sync_with_stdio(false);
string str;
while(getline(cin,str)&&str!="#")
{
bool note=true;
int now,tar;
vector<int> gl[MAXN];
for(int i=0; i<str.size(); ++i)
{
if(isalpha(str[i]))
{
if(note) now=str[i]-'A';
else
{
tar=str[i]-'A';
gl[now].push_back(tar);
}
}
if(str[i]==';') note=true;
else if(str[i]==':') note=false;
}
string arr;
for(int i=0; i<str.size(); ++i)
if(isalpha(str[i])&&find(arr.begin(),arr.end(),str[i])==arr.end())
arr+=str[i];
int minn=INF;
string ans;
sort(arr.begin(),arr.end());
do
{
int res=0;
for(int i=0; i<arr.size(); ++i)
{
int num=arr[i]-'A';
for(int j=0; j<gl[num].size(); ++j)
{
for(int k=0; k<arr.size(); ++k)
if(arr[k]==gl[num][j]+'A')
{
int L=abs(i-k);
res=max(res,L);
break;
}
}
}
if(res<minn)
{
minn=res;
ans=arr;
}
}
while(next_permutation(arr.begin(),arr.end()));
for(int i=0; i<ans.size(); ++i)
if(!i) cout<<ans[i];
else cout<<" "<<ans[i];
cout<<" -> "<<minn<<endl;
}
return 0;
}