8个点 全排列 一个个的判断
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 30;
int Words[maxn];
int T[maxn],RT[maxn];///A 表示 0 B 表示1
int G[maxn][maxn];
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
char str[100];
while(gets(str))
{
if(str[0] == '#')break;
memset(Words,0,sizeof(Words));
memset(G,0,sizeof(G));
memset(T,-1,sizeof(T));
for(int l = 0; l < strlen(str); l++)
{
int x = str[l] - 'A';
Words[x] = 1;
l += 2;
while(l < strlen(str) && str[l] != ';')
{
int y = str[l++] - 'A';
Words[y] = 1;
G[x][y] = G[y][x] = 1;
}
}
int N = 0;
for(int i = 0; i < 26; i++)
if(Words[i] == 1)T[N++] = i;
sort(T,T+N);
int MIN = 10;
do
{
int MAX = 0;
for(int i = 0; i < N; i++)
for(int j = i+1; j < N; j++)
if(G[T[i]][T[j]] == 1) MAX = (j - i) > MAX ? (j - i) : MAX; ///同种排列中取最大的带宽
if(MIN > MAX)///两种排列中取相对较小的带宽
{
MIN = MAX;
for(int i = 0; i < N; i++)
RT[i] = T[i];
}
}while(next_permutation(T,T+N));
for(int i = 0 ; i < N; i++)
printf("%c ", 'A' + RT[i]);
printf("-> %d\n",MIN);
}
return 0;
}