求全排列,这些排列中,有关系的元素下表差的最大值 中间的最小值
然而并没有用剪枝。。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <cmath>
#include <set>
#include <algorithm>
using namespace std;
#define inf 0x3f3f3f3f
set<int> c[27];
bool vis[27],flag[27];
int num = 0;
int ans = inf,aans[10];
int dfs(int n,int a[10])
{
if(n == num)
{
int nmax = 0;
for(int i = 0; i < num; i++)
{
for(auto it : c[a[i]])
for(int j = 0; j < num; j++)
if(a[j] == it)
nmax = max(nmax,abs(i-j));
}
if(ans > nmax)
{
ans = nmax;
for(int i = 0; i < n ; i++)
aans[i] = a[i];
}
return 0;
}
else
{
for(int i = 0; i < 26; i++)
{
if(vis[i] && !flag[i])
{
a[n] = i;
flag[i] = 1;
dfs(n+1,a);
flag[i] = 0;
}
}
}
}
int main()
{
char s[150];
while(cin.getline(s,150) && s[0] != '#')
{
memset(vis,0,sizeof(vis));
for(int i = 0; i < 26; i++)
c[i].clear();
ans = inf;
int slen = strlen(s);
num = 0;
for(int i = 0; i < slen; i++)
{
if(s[i] == ';')
continue;
else if(s[i] != ':' && s[i] != ';')
{
vis[s[i]-'A'] = 1;
int j;
for(j = i+2; ; j++)
{
if(s[j] == ';' || s[j] == '\0')break;
c[s[i] - 'A'].insert(s[j]-'A');
c[s[j] - 'A'].insert(s[i]-'A');
vis[s[j]-'A'] = 1;
}
i = j;
}
}
for(int i = 0; i < 26; i++)
if(vis[i]) num++;
int a[10] = {0};
for(int i = 0; i < 26; i++)
{
if(vis[i])
{
flag[i] = 1;
a[0] = i;
dfs(1,a);
flag[i] = 0;
}
}
for(int i = 0; i < num; i++)
printf("%c ",aans[i]+'A');
printf("-> ");
printf("%d\n",ans);
}
return 0;
}
还是觉得自己的代码写的不好看,和真的太差了。