简单搜索题,求带宽最小的排列,增加了两个数组标记点对点的映射
#include <stdio.h>
#include <string.h>
int map[30][30],n=0,m;
int a[10],vis[10],check[30];
int p[10],ans[10],min;
int dfs(int cur)
{
if(cur==m)
{
int k=0;
for(int i=0;i<m-1;i++)
{
for(int j=i;j<m;j++)
{
if(map[a[p[i]]][a[p[j]]])
{
int t=i-j>0?i-j:j-i;
if(t>k)k=t;
}
}
}
if(k<min)
{
for(int i=0;i<m;i++)
ans[i]=a[p[i]];
min=k;
}
}
for(int i=0; i<m; i++)
{
if(!vis[i])
{
vis[i]=1;
p[cur]=i;
dfs(cur+1);
p[cur]=0;
vis[i]=0;
}
}
return 0;
}
int main()
{
char ch,t;
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
memset(check,0,sizeof(check));
while(1)
{
scanf("%c",&ch);
if(ch=='#')break;
else
{
t=ch;
getchar();
while(1)
{
scanf("%c",&ch);
if(ch==';'||ch=='\n')break;
map[t-'A'][ch-'A']=1;
map[ch-'A'][t-'A']=1;
check[t-'A']=check[ch-'A']=1;
}
}
if(ch=='\n')
{
m=0;
for(int i=0;i<26;i++)
{
if(check[i])
{
a[m++]=i;
}
}
min=m;
dfs(0);
for(int i=0;i<m;i++)
printf("%c ",ans[i]+'A');
printf("-> %d\n",min);
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
memset(check,0,sizeof(check));
n=0;
}
}
return 0;
}