一道裸的拓扑排序,回溯输出全部序列即可。还有就是我自己太懒,最后多出了一空行结果wa了一次,还查了半天。。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define N 310
using namespace std;
int g[N][N];
int ru[N];
int vis[N];
int len;
char s[N],str[N];
vector <int> vec;
void dfs(int now)
{if(vec.size()>len-1){for(int i=0;i<vec.size();i++){printf("%c",vec[i]+'a'-1);}printf("\n");return ;}int i;for(i=0;i<len;i++){if(g[now][str[i]-'a'+1]==1 && ru[str[i]-'a'+1]!=0 ){ru[str[i]-'a'+1]--;}}for(int j=0;j<len;j++){if(ru[str[j]-'a'+1]==0 && vis[str[j]-'a'+1]==0){vec.push_back(str[j]-'a'+1);vis[str[j]-'a'+1]=1;dfs(str[j]-'a'+1);vis[str[j]-'a'+1]=0;vec.pop_back();//ru[str[j]-'a'+1]++;}}for(i=0;i<len;i++){if(g[now][str[i]-'a'+1]==1){ru[str[i]-'a'+1]++;}}//之前这一块没写好,即恢复路径没有做好
}
int main()
{int con=0;while(gets(s)){vec.clear();int cnt=0;for(int i=0;i<strlen(s);i++){str[cnt]=s[i];i++;cnt++;}sort(str,str+cnt);gets(s);memset(g,0,sizeof(g));memset(ru,0,sizeof(ru));memset(vis,0,sizeof(vis));for(int i=0;i<strlen(s)-2;i+=4){if(g[s[i]-'a'+1][s[i+2]-'a'+1]==0){g[s[i]-'a'+1][s[i+2]-'a'+1]=1;ru[s[i+2]-'a'+1]++;}}if(con==0){con++;}else{printf("\n");}len=cnt;for(int i=0;i<len;i++){if(ru[str[i]-'a'+1]==0){vec.push_back(str[i]-'a'+1);vis[str[i]-'a'+1]=1;dfs(str[i]-'a'+1);vis[str[i]-'a'+1]=0;vec.pop_back();}}}return 0;
}