题目点这里!!!
先排序,因为是按字典序排,用vector和二维数组存边各有好处,看情况,
二维数组存:
1.可以直接查找现在这条边,
2.可以记录对应的出度入度
vector存:
1.可以直接套着访问下条边
2.耍酷!!!
// 板子
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
int edge[100][100];
int cnt = 0;
int num[40];
int outdu[40];
char jl[40];
int vis[40];
int len;
void Tuobu(int pos)
{
if (pos == len + 1)
{
for (int i = 1; i <= len; ++i)
{
cout << jl[i];
}
cout << endl;
return ;
}
for (int i = 1; i <= len; ++i)
{
if (!vis[num[i]] && outdu[num[i]] == 0)
{
jl[pos] = num[i] + 'a';
vis[num[i]] = 1;
for (int j = 1; j <= len; ++j)
{
if (!vis[num[j]] && edge[num[i]][num[j]] == 1)
{
outdu[num[j]]--;
}
}
Tuobu(pos + 1);
vis[num[i]] = 0;
for (int j = 1; j <= len; ++j)
{
if (!vis[num[j]] && edge[num[i]][num[j]] == 1)
{
outdu[num[j]]++;
}
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
string s;
while (getline(cin, s))
{
memset(edge, 0, sizeof edge);
memset(num, 0, sizeof num);
memset(outdu, 0, sizeof outdu);
memset(vis, 0, sizeof vis);
for (int i = 0; i < s.length(); ++i)
{
if (s[i] != ' ')
{
num[++cnt] = s[i] - 'a';
}
}
sort(num + 1, num + 1 + cnt);
len = cnt;
getline(cin, s);
cnt = 0;
for (int i = 0; i < s.length(); ++i)
{
int temp[3];
if (s[i] != ' ')
{
temp[++cnt] = s[i] - 'a';
}
if (cnt == 2)
{
edge[temp[1]][temp[2]] = 1;
outdu[temp[2]]++;
cnt = 0;
}
}
Tuobu(1);
cout << endl;
}
return 0;
}