您的位置:首页 > 其它

UVA 140——Bandwidth(暴力)

2017-07-26 00:18 387 查看
题目连接:点击打开链接

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

解题思路:因为一个字符串中最多有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
= *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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: