题目大意:
这道题很水的,纯暴力都可以过。有点难度也就是题意不好懂。。。
题目给你一个图,表示点和点之间的连接关系,然后让你找到这样的一个字符排序,使得带宽最小。带宽是这样定义的:在字符排序中,相连的点在字符串中的最大距离。这里相连的点就是题目输入的信息,距离指的是在字符串中的距离。
比如ABCFGDHE,题目中给出A和F相连,在这个字符串中的距离就是3,A和B相连,在字符串中的距离就是1。它的带宽为3。是最小的。
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<string>
#include<cstring>
#include<math.h>
#include<algorithm>
#include<assert.h>
#include<stdlib.h>
#include<stack>
#include<vector>
#include<map>
#include<set>
#define pi acos(-1.0)
#define ll long long
using namespace std;
struct node
{
char s;
char e;
};
node a [100];
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
char tmp[500];
char qi;
int zimu[27]={0};
while(scanf("%s",tmp)&&tmp[0]!='#')
{
int shu;
memset(zimu,0,sizeof(zimu));
int tt=0;
qi=tmp[0];
for(int i=1;i<strlen(tmp);i++)
{
if(tmp[i]==';')
{
qi=tmp[i+1];
continue;
}
if(tmp[i]==':')
continue;
zimu[tmp[i]-'A'+1]=1;
zimu[qi-'A'+1]=1;
a[tt].s=qi;
a[tt++].e=tmp[i];
}
shu=tt;
char ch[30];
tt=0;
for(int i=1;i<=26;i++)
if(zimu[i])
ch[tt++]=char('A'-1+i);
ch[tt]='\0';
sort(ch,ch+tt);
int ans=99999;
int Max=0;
int cixun=0;
string res;
do
{
Max=0;
for(int i=0;i<shu;i++)
{
int temp=abs(strchr(ch,a[i].s)-strchr(ch,a[i].e));
Max=max(Max,temp);
if(Max>=ans)
break;
}
if(Max<ans)
{
ans=Max;
res=ch;
}
}while(next_permutation(ch,ch+tt));
cout<<res[0];
for(int i=1;i<res.size();i++)
cout<<" "<<res[i];
printf(" -> %d\n",ans);
}
return 0;
}