真不想吐槽CSDN,写完的博客发表时一堆乱码,哎,无语啊~~
第二次做,注意字符串的处理和剪枝。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
char a[600];
int b[30],map[30][30],fa,flag,cnt,maxn,ans;
int save[10],node[10];
int main()
{
freopen("f.txt","r",stdin);
while(gets(a)&&a[0]!='#'){
memset(map,0,sizeof(map));
memset(b,0,sizeof(b));
int len=strlen(a);
flag=0;
for(int i=0;i<len;i++){
if(a[i]>='A'&&a[i]<='Z'){
b[a[i]-'A']=1;
}
if(a[i]==':'){
fa=a[i-1]-'A';
flag=1;
}
else if(flag&&a[i]>='A'&&a[i]<='Z'){
map[a[i]-'A'][fa]=map[fa][a[i]-'A']=1;
}
else if(a[i]==';'){
flag=0;
}
}
cnt=0;
for(int i=0;i<27;i++){
if(b[i])
node[cnt++]=i;
}
maxn=10;
do{
ans=0;
for(int i=0;i<cnt;i++){
for(int j=i+1;j<cnt;j++){
if(map[node[i]][node[j]]&&abs(i-j)>ans)
ans=abs(i-j);
}
if(ans>maxn)break;
}
if(maxn>ans){
maxn=ans;
memcpy(save,node,sizeof(node));
}
}while(next_permutation(node,node+cnt));
for(int i=0;i<cnt;i++)
printf("%c ",save[i]+'A');
printf("-> %d\n",maxn);
}
return 0;
}