#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 10;
const int INF = 0x7fffffff;
int main()
{
char s[1000];
while( scanf("%s", s) && s[0]!= '#')
{
int n = 0;
int id[300] = {};
char letter[maxn] = {};
for(char c= 'A'; c <= 'Z'; c++)
if(strchr(s, c) != NULL)
{
id[c] = n++;
letter[id[c]] = c; //建立双射数组 id: char - int letter: int - char
}
int p = 0, q = 0, len = strlen(s);
vector<int> u, v;
for(;;) //使用 p q 定位 ';' 与 ';'
{
while(s[p] != ':' && p < len)
p++;
if( p == len) //p位于q前 到底退出
break;
while(s[q] != ';' && q < len)
q++;
for(int i = p+1; i < q; i++)
{
u.push_back(id[s[p-1]]);
v.push_back(id[s[i]]);
}
p++;
q++; //继续移动
}
// for(int i = 0; i < u.size(); i++)
// {
// cout<<u[i]<<" "<<v[i]<<endl;
// }
int Pos[maxn] = {}, P[maxn] = {}, bestP[maxn] = {}; //P[i] = j j放置在i上 Pos[i] = j i在位置j上
int bandwidth = 0, ans = INF;
for(int i = 0; i < n; i++)
P[i] = i;
do{
for(int i = 0; i < n; i++)
Pos[P[i]] = i;
bandwidth = 0;
for(int i = 0; i < u.size(); i++)
{
bandwidth = max(bandwidth, abs(Pos[u[i]] - Pos[v[i]]));
if(bandwidth > ans)
break;
}
if(bandwidth < ans)
{
ans = bandwidth;
memcpy(bestP, P, sizeof(P));
}
}while(next_permutation(P, P+n));
for(int i = 0; i < n; i++)
printf("%c ", letter[bestP[i]]);
printf("-> %d\n", ans);
}
return 0;
}
uva140 STL枚举排列加剪枝
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 使用C++ STL的next_permutation函数可以简单的枚举出一个升序排列的字符串的全排列,它包含在头文...