#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
char s[1010],rk[30];
int id[1010],n,a[10],b[10],vis[10],ans,ANS[11];
vector<int>v[10];
int dfs(int x,int step){
if(step==n){
int sum=-1;
for(int i=0;i<n;i++){
for(int j=0;j<v[i].size();j++){
int to=v[i][j];
sum=max(sum,abs(b[i]-b[to]));
}
}
if(ans>sum){
ans=sum;
memcpy(ANS,a,sizeof(a));
}
return 1;
}
int cnt=0;
for(int j=0;j<v[x].size();j++){
int to=v[x][j];
if(!vis[to])cnt++;
}
if(cnt>ans)/*剪枝1*/
return 0;
for(int j=0;j<n;j++){
if(!vis[j]){
int f=1;
for(int i=0;i<v[j].size();i++){
int to=v[j][i];
if(vis[to]&&step-b[to]>ans){
f=0;
break;
}
}
if(!f)continue;//剪枝2
vis[j]=1;
b[j]=step;
a[step]=j;
dfs(j,step+1);
vis[j]=0;
}
}
}
int main(){
while(~scanf("%s",s)&&s[0]!='#'){
n=0,ans=INF;
for(int i=0;i<9;i++)
v[i].clear();
for(int i='A';i<='Z';i++){
if(strchr(s,i)!=NULL){//如果找得到i字符
rk[n]=i;
id[i]=n++;
}
}
int i=0,len=strlen(s);
while(i<len){
int x=id[s[i]];
i+=2;
while(i<len&&s[i]!=';'){
int y=id[s[i++]];
v[x].push_back(y);
v[y].push_back(x);
}
i++;
}
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
vis[i]=1;
a[0]=i;
b[i]=0;
dfs(i,1);
vis[i]=0;
}
for(int i=0;i<n;i++){
printf("%c ",rk[ANS[i]]);
}
printf("-> %d\n",ans);
}
}
UVA 140
最新推荐文章于 2019-09-01 17:58:09 发布