本题最恶心的不是算法是输入。。用了gets。还有几个数组的初始化也非常重要。。害我WA了好多回。。
所谓的字典序输出只需要sort外加DFS就可以了。
这里关于输入还是去学学别的大神,不要看我的。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char s[550],ans[55];
int map[55][55];
int sum[550],num;
int judge[550];
int charge[550];
void dfs(int n){
if(n==num){
/*for(int i=0;i<num;i++)
printf("%c",ans[i]);
printf("\n");*/
printf("%s\n",ans);
return;
}
for(int i=0;i<num;i++){
if(charge[judge[i]]==0&&sum[judge[i]]==0){
charge[judge[i]]=1;
ans[n]=judge[i]+'a';
for(int j=0;j<num;j++){
if(map[judge[i]][judge[j]]==1){
sum[judge[j]]--;
}
}
dfs(n+1);
charge[judge[i]]=0;
for(int j=0;j<num;j++){
if(map[judge[i]][judge[j]]==1){
sum[judge[j]]++;
}
}
}
}
return;
}
int main(){
int len;
//char x,y;
while(gets(s)){
len=strlen(s);
num=0;
memset(sum,0,sizeof(sum));
memset(map,0,sizeof(map));
memset(charge,0,sizeof(charge));
memset(ans,0,sizeof(ans));
for(int i=0;i<len;i++){
if(s[i]!=' '){
judge[num++]=s[i]-'a';
}
}
//printf("weryi\n");
gets(s);
len=strlen(s);
sort(judge,judge+num);
//for(int i=0;i<num;i++)printf("%d",judge[i]);
for(int i=0;i<len;){
//printf("%c %c\n",s[i],s[i+2]);
map[s[i]-'a'][s[i+2]-'a']=1;
sum[s[i+2]-'a']++;
i+=4;
}
//for(int i=0;i<num;i++) printf("%d\n",sum[judge[i]]);
dfs(0);
printf("\n");
}
return 0;
}