题目
题意
给出一些变量和它们之间的先后顺序关系,求出这些变量可能的顺序,按字典序输出所有结果。
思路
因为要按照字典序输出,所以要对这些字母排序(我的方法是将这些字母转化为数字),因为要输出所有结果,表示答案不只有一个,就需要dfs回溯,总体来说就是拓扑排序+dfs回溯
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e3+5;
const int inf=0x3f3f3f3f;
typedef long long ll;
int n;
int a[maxn];
int G[maxn][maxn],indegree[maxn],ans[maxn];
bool vis[maxn];
void topsort(int pos)
{
if(pos==n)
{
for(int i=0;i<n;i++)
printf("%c",ans[i]+'a');
cout<<endl;
return;
}
for(int i=0;i<n;i++)
{
if(!vis[a[i]]&&!indegree[a[i]])
{
vis[a[i]]=true;
ans[pos]=a[i];
for(int j=0;j<n;j++)
{
if(G[a[i]][a[j]])
indegree[a[j]]--;
}
topsort(pos+1);
vis[a[i]]=false;
for(int j=0;j<n;j++)
{
if(G[a[i]][a[j]])
indegree[a[j]]++;
}
}
}
}
int main()
{
string s;
while(getline(cin,s))
{
memset(vis,false,sizeof(vis));
memset(indegree,0,sizeof(indegree));
memset(G,0,sizeof(G));
n=0;
for(int i=0;i<s.size();i++)
{
if(s[i]>='a'&&s[i]<='z')
a[n++]=s[i]-'a';
}
sort(a,a+n);
getline(cin,s);
int cnt=0,temp[2];
for(int i=0;i<s.size();i++)
{
if(s[i]!=' ')
temp[cnt++]=s[i]-'a';
if(cnt==2)
{
cnt=0;
G[temp[0]][temp[1]]=1;
indegree[temp[1]]++;
}
}
topsort(0);
cout<<endl;
}
}
ps:注意输出格式!