UVA

来源:互联网 发布:平安委外管理岗 知乎 编辑:程序博客网 时间:2024/06/03 10:18

思路:存储所有路径,全排列所有点。


#include <iostream>#include <iomanip>#include <algorithm>#include <cstdio>#include <cstring>#include <queue>#include <string>#include <cmath>#include <vector>#include <utility>#include <set>#include <climits>//#pragma comment(linker, "/STACK:1024000000,1024000000")#define INF 2147483647using namespace std;typedef long long ll;typedef pair<char,char > P;int i,j,n;int vis[30];vector <P> v;string s;char flag[10];bool ok1;int main(){    while(cin>>s)    {        if(s[0]!='#')        {            char l,r;            int num=0;            memset(flag,0,sizeof(flag));            memset(vis,0,sizeof(vis));            v.clear();            ok1=false;            for(i=0; i<s.size(); i++)            {                if(s[i]==':')                    ok1=true;                else if(s[i]==';')                    ok1=false;                else                {                    if(!ok1)                    {                        l=s[i];                    }                    else                    {                        v.push_back(P(l,s[i]));                    }                    if(vis[s[i]-'A']==0)                    {                        flag[num]=s[i];                        num++;                        vis[s[i]-'A']++;                    }                }            }            sort(flag,flag+num);            char path[10];            memset(path,0,sizeof(path));            int min_=INF;            do            {                int sum=1;                int max_=-1;                for(i=0; i<num; i++)                {                    for(j=0; j<num; j++)                        for(int z=0; z<v.size(); z++)                            if(flag[i]==v[z].first&&flag[j]==v[z].second)                                if(sum<abs(j-i)+1)                                sum=abs(j-i);                    if(max_<sum)                        max_=sum;                }                if(min_>max_)                {                    min_=max_;                    for(i=0;i<num;i++)                        path[i]=flag[i];                }            }            while(next_permutation(flag,flag+num));            for(i=0; i<num; i++)            {                if(i==0)                    printf("%c",path[i]);                else                    printf(" %c",path[i]);            }            printf(" -> %d\n",min_);        }    }    return 0;}