UVA 140 Bandwidth (暴力)
2016-05-28 14:13
369 查看
题意:给最多8个点,输入是每个点与某几个点相邻,带宽的意思是重排列后每两个相邻的点的相隔距离,每个排列的带宽是排列中出现的最大带宽,要求输出带宽最小的排列并输出带宽
思路不难,就是输入处理起来比较麻烦,先把输入搞定,然后再用STL里的下一个排列函数遍历每个排列即可,我在遍历过程中加了一个判定条件
代码如下
思路不难,就是输入处理起来比较麻烦,先把输入搞定,然后再用STL里的下一个排列函数遍历每个排列即可,我在遍历过程中加了一个判定条件
代码如下
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<vector> using namespace std; vector<int> g[27]; vector<char> cou; int main() { char a[500]; int dig[27]; while(cin>>a) { cou.clear(); for(int i=0;i<27;i++) g[i].clear(); if(a[0]=='#') break; int l=strlen(a); int f1=0,p,cal=0; for(int i=0; i<l; i++) { if(isalpha(a[i])) cou.push_back(a[i]-'A'); if(a[i]==';') f1=0; if(f1==0&&a[i]!=';') { cal++; p=a[i]-'A'; f1=1; } else if(f1==1) { if(a[i]==':') f1=2; } else if(f1==2) g[p].push_back(a[i]-'A'); } int num=0; int save[27]; memset(dig,0,sizeof(dig)); memset(save,0,sizeof(save)); for(int i=0; i<27; i++) if(count(cou.begin(),cou.end(),i)) dig[num++]=i; int minn=100000; do { int pos[27]; memset(pos,0,sizeof(pos)); for(int i=0; i<num; i++) pos[dig[i]]=i; int maxx=0,flag=0; for(int i=0; i<27; i++) { if(flag==1) break; for(int j=0; j<g[i].size(); j++) { maxx=max(maxx,abs(pos[i]-pos[g[i][j]])); if(maxx>minn) {flag=1;break;} } } if(maxx<minn) { minn=maxx; for(int i=0;i<num;i++) save[i]=dig[i]; } } while(next_permutation(dig,dig+num)); for(int i=0;i<num;i++) printf("%c ",save[i]+'A'); printf("-> %d\n",minn); } }
相关文章推荐
- 用fail2ban阻止SSH和VSFTP暴力破解密码
- 1.10055 - Hashmat the brave warrior
- 2.10071 - Back to High School Physics
- 3.458 - The Decoder
- 4.694 - The Collatz Sequence
- 6.494 - Kindergarten Counting Game
- 7.490 - Rotating Sentences
- 8.414 - Machined Surfaces
- 9.488 - Triangle Wave
- A.457 - Linear Cellular Automata
- B.489 - Hangman Judge
- C.445 - Marvelous Mazes
- 1.10494 - If We Were a Child Again
- 2.424 - Integer Inquiry
- 3.10250 - The Other Two Trees
- 5.465 - Overflow
- 6.113 - Power of Cryptography
- 7.10161 - Ant on a Chessboard
- 8.621 - Secret Research
- 9.401 - Palindromes