原题:UVA-140
看UVA的题目大片的英文经常被吓到 英语弱渣伤不起。。
本来以为会很难,回溯法?什么鬼
后来看了题解。。特么的不就是DFS的枚举吗!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s[200];
int out[30],map[30][30],v[30];
int node[30],temp[30],suc[30],address[30],num;
int Min;
int judge() {
int Max=-1;
for(int i=0; i<num; i++) {
int MM=-1;
for(int j=0; j<num; j++) {
if(map[node[temp[i]]][node[j]]) {
int l=abs(i-address[node[j]]);
if(MM<l) MM=l;
}
}
if(MM>Max) Max=MM;
}
return Max;
}
void dfs(int t) {
if(Min==1) return ;
for(int i=0; i<num; i++) {
if(!v[i]) {
temp[t]=i;
v[i]=1;
address[node[i]]=t;
dfs(t+1);
v[i]=0;
}
}
if(t==num) {
int Max=judge();
if(Max<Min) {
Min=Max;
memcpy(suc,temp,sizeof(temp));
}
return ;
}
}
int main() {
int i;
while(gets(s)) {
if(s[0]=='#') break;
memset(out,0,sizeof(out));
memset(v,0,sizeof(v));
memset(map,0,sizeof(map));
int l=strlen(s);
s[l]=';';
i=0;
while(i<l) {
int x=s[i]-'A';
out[x]=1;
i+=2;
while(s[i]!=';') {
int y=s[i]-'A';
out[y]=1;
map[x][y]=1;
i++;
}
i++;
}
//printf("yes");
num=0;
for(i=0; i<30; i++)
if(out[i])
node[num++]=i;
//printf("num:%d\n",num);
Min=9999999;
dfs(0);
for(i=0; i<num; i++)
printf("%c ",node[suc[i]]+'A');
printf("-> %d\n",Min);
}
return 0;
}