UVA 140——Bandwidth(暴力)

题目连接:点击打开链接

题目大意:给你一个字符串,表示点之间的关系,然后把这些点排成一列,所有有关系的点中的最长距离为这一串点所组成的图的宽带,然后让你求出求出这一串点的最小宽带

解题思路:因为一个字符串中最多有8个点,所以枚举出所有可能的序列,然后挨着计算所有的宽带,找出最小即可

注意:注意该题中对于字符串的处理,然后生成全排列的运用

代码:

//UVA 140全排列练习题
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;


int main()
{
   string str;
   while(cin >> str && str != "#")
   {
       set<char>point;
       int len = str.size();
      // cout << len << endl;
       int Map[100][100];
       memset(Map, 0, sizeof(Map));
       int flag = 0;
       int ch;
       for(int i = 0; i < len; i++)
       {
            if(str[i] == ':')  continue;
            else if(str[i] == ';') flag = 0;
            else
            {
                point.insert(str[i]);
                if(flag == 0)
                {
                   ch = str[i] - 'A';
                   flag = 1;
                }
                else if(flag == 1)
                {
                    Map[ch][str[i]-'A'] = 1;
                    Map[str[i]-'A'][ch] = 1;
                }
            }
       }

    set<char>::iterator iter;
    int n;
    int p[10]; //  把单词转化成了对应的数字
    for(iter = point.begin(), n = 0; iter != point.end(); iter++, n++)
    {
       // cout << *iter << endl;
        p[n] = *iter - 'A';
    }
    sort(p, p+n);
    int minn = 100;
    int rs[10];
/
 do
    {
            int maxx = 0;
            for(int i = 0; i < n; i++)
            {
                for(int j = i+1; j < n; j++)
                {
                    if(Map[p[i]][p[j]] == 1) //这路需要注意哟, 因为存入的是每个字符所代表
                    //的数字,所以这里面判断的时候就需要用p[i]p[j]来判断!!!!
                    {
                        if(j - i > maxx)
                            maxx = j - i;
                    }
                }
            }
            if(maxx < minn)
            {
                minn = maxx;
                for(int l = 0; l < n; l++)
                    rs[l] = p[l];
            }
    }while(next_permutation(p, p+n)); // 生成全排列
//

    //输出
    for(int i = 0; i < n; i++)
    {
        if(i == 0) printf("%c", rs[i] + 'A');
        else printf(" %c", rs[i] + 'A');
    }
    printf(" -> %d\n", minn);
   }
   return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值