UVa:140 Bandwidth

这都是之前第七章留下来的水题。

枚举全排列。然后挨个求就可以了。

 

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
#include <string>
#include <algorithm>
#define MAXN 30
#define MOD 1000000007
#define INF 2139062143
#define ll long long
using namespace std;
int main()
{
    std::ios::sync_with_stdio(false);
    string str;
    while(getline(cin,str)&&str!="#")
    {
        bool note=true;
        int now,tar;
        vector<int> gl[MAXN];
        for(int i=0; i<str.size(); ++i)
        {
            if(isalpha(str[i]))
            {
                if(note) now=str[i]-'A';
                else
                {
                    tar=str[i]-'A';
                    gl[now].push_back(tar);
                }
            }
            if(str[i]==';') note=true;
            else if(str[i]==':') note=false;
        }
        string arr;
        for(int i=0; i<str.size(); ++i)
            if(isalpha(str[i])&&find(arr.begin(),arr.end(),str[i])==arr.end())
                arr+=str[i];
        int minn=INF;
        string ans;
        sort(arr.begin(),arr.end());
        do
        {
            int res=0;
            for(int i=0; i<arr.size(); ++i)
            {
                int num=arr[i]-'A';
                for(int j=0; j<gl[num].size(); ++j)
                {
                    for(int k=0; k<arr.size(); ++k)
                        if(arr[k]==gl[num][j]+'A')
                        {
                            int L=abs(i-k);
                            res=max(res,L);
                            break;
                        }
                }
            }
            if(res<minn)
            {
                minn=res;
                ans=arr;
            }
        }
        while(next_permutation(arr.begin(),arr.end()));
        for(int i=0; i<ans.size(); ++i)
            if(!i) cout<<ans[i];
            else cout<<" "<<ans[i];
        cout<<" -> "<<minn<<endl;
    }
    return 0;
}


 

你可能感兴趣的:(搜索,全排列,暴力)