https://vjudge.net/problem/UVA-140
这道题本来挺简单的,结果一直wa,心态炸裂,没注意输出,当有多个满足条件的输出时,输出字典序最小的一个!!!
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<math.h>
#include<string>
#include<string.h>
#include<map>
#include<unordered_map>
#include<unordered_set>
#include<set>
#include<stack>
#include<sstream>
//#include <Eigen/Dense>
//#include <Eigen/Geometry>
//using namespace Eigen;
using namespace std;
int vis[30], g[30][30];
int n = 0, dis = 0x3f3f3f3f;
vector<int> ans, r, c;
int caldis()
{
int temp = 0;
for (int i = 0; i < r.size(); i++)
{
for (int j = r.size() - 1; j >= 0; j--)
{
if (g[r[i]][r[j]])
{
temp = max(temp, j - i);
break;
}
}
}
return temp;
}
void dfs(int cur)
{
int temp = caldis();
if (temp > dis)
return;
if (cur == n)
{
if (temp < dis)
{
dis = temp;
ans = r;
}
return;
}
for (int i = 0; i < n; i++)
{
if (!vis[i])
{
vis[i] = 1;
r.push_back(c[i]);
dfs(cur + 1);
r.pop_back();
vis[i] = 0;
}
}
}
//A:FB; B:GC; D:GC; F:AGH; E:HD
//#
int main()
{
string s;
while (cin >> s && s[0] != '#')
{
memset(g, 0, sizeof(g));
memset(vis, 0, sizeof(vis));
c.clear();
n = 0, dis = 0x3f3f3f3f;
int u = s[0] - 'A';
c.push_back(u);
for (int i = 1; i < s.size(); i++)
{
if (s[i] == ';')
{
u = s[++i] - 'A';
if (!count(c.begin(), c.end(), s[i] - 'A'))
c.push_back(u);
continue;
}
if (s[i] >= 'A' && s[i] <= 'Z')
{
if (!count(c.begin(), c.end(), s[i] - 'A'))
c.push_back(s[i] - 'A');
g[u][s[i] - 'A'] = 1;
g[s[i] - 'A'][u] = 1;
}
}
n = c.size();
sort(c.begin(), c.end());
dfs(0);
for (int i = 0; i < ans.size(); i++)
printf("%c ", ans[i] + 'A');
printf("-> %d\n", dis);
}
return 0;
}