写的比较乱,全排列 的形式 + 回溯
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s[1000];
int k ;//结点个数
int v[100];
struct node{
char name;
char next[15];
int len;
int flag;
}a[30],b[10];
struct node1{
char p[20];
int val;
}ans,t;
bool cmp(node x,node y)
{
return x.name < y.name;
}
bool isA(char c)
{
if(c >= 'A' && c <= 'Z')
return true;
return false;
}
int idx(char c)
{
for(int i = 0;i < k;++i)
if(t.p[i] == c)
return i;
}
int idx1(char c)
{
for(int i = 0;i < k;++i)
if(b[i].name == c)
return i;
}
int bandwidth(char c)
{
int idx_c = idx(c);
int idx_c1 = idx1(c);
int cnt = 0;
for(int i = 0;i < b[idx_c1].len;++i)
{
int idx_t = idx(b[idx_c1].next[i]);
cnt = max(cnt,idx_c - idx_t > 0 ? idx_c - idx_t : idx_t - idx_c);
}
return cnt;
}
void dfs(int cur)
{
if(cur == k)
{
int cnt = 0;
t.p[k] = '\0';
for(int i = 0;i < k;++i)
cnt = max(cnt,bandwidth(t.p[i]));
if(cnt < ans.val)
{
strcpy(ans.p,t.p);
ans.val = cnt;
}
return ;
}
for(int i = 0;i < k;++i)
{
if(!v[i])
{
t.p[cur] = b[i].name;
v[i] = 1;
dfs(cur + 1);
v[i] = 0;
}
}
}
int main()
{
while(~scanf("%s",s) && s[0] != '#')
{
memset(a,0,sizeof(a));
memset(v,0,sizeof(v));
int len = strlen(s);
k = 0; //结点个数
ans.val = 9999999;
int temp = s[0] - 'A';
a[temp].name = s[0];
a[temp].flag = 1;
for(int i = 1;i < len;++i)
{
if(isA(s[i]) && s[i + 1] == ':'){ //如果是结点名字
a[s[i] - 'A'].name = s[i];
temp = s[i] - 'A';
a[temp].flag = 1;
}
else if(isA(s[i]))
{
int ok = 1;
for(int j = 0;j < a[temp].len;++j)
if(a[temp].next[j] == s[i]){
ok = 0;
break;
}
if(ok)
a[temp].next[a[temp].len++] = s[i];
ok = 1;
for(int j = 0;j < a[s[i] - 'A'].len;++j)
{
if(a[s[i] - 'A'].next[j] == a[temp].name)
{
ok = 0;
break;
}
}
if(ok){
a[s[i] - 'A'].next[a[s[i] - 'A'].len++] = a[temp].name;
a[s[i] - 'A'].flag = 1;
a[s[i] - 'A'].name = s[i];
}
}
}
for(int i = 0;i < 26;++i)
if(a[i].flag)
{
//printf("i = %d\n",i);
b[k].name = a[i].name;
for(int j = 0;j < a[i].len;++j)
b[k].next[j] = a[i].next[j];
b[k++].len = a[i].len;
//printf("k = %d\n",k);
}
dfs(0);
for(int i = 0;i < k;++i)
printf("%c ",ans.p[i]);
printf("-> ");
printf("%d\n",ans.val);
/*for(int i = 0;i < k;++i)
{
printf("结点名字%c:相连结点为:",a[i].name);
for(int j = 0;j < a[i].len;++j)
printf("%c",a[i].next[j]);
printf("\n");
}*/
}
}