Following Orders(拓扑排序)
解题思路:一个一个的添,当填满的时候输出,注意添的时候,新添的一个必须没被用过,并且前面没比他小的. 比如第二行输入时a b;代表a在b前面,则填入a时,前面不能有b;
#include <iostream>
#include <string>
using namespace std;
const int maxn=30;
const int maxm=500;
int n;
int G[maxn][maxn];
int vis[maxn];
int ans[maxn];
int cnt;
bool mark[maxn];
bool ok(int i,int cnt)
{int j;
for(j=0;j<cnt;j++)
if(G[i][ans[j]])return 0;
return 1;
}
void dfs(int cnt)
{int i,j;
if(cnt==n)
{for(j=0;j<n;j++)
cout<<char(ans[j]+'a');
cout<<endl;}
else{
for(i=0;i<26;i++)
if(mark[i]&&!vis[i]&&ok(i,cnt))
{vis[i]=1;
ans[cnt]=i;
dfs(cnt+1);
vis[i]=0;
}
}
}
int main()
{
char str[1000];
while(gets(str))//注意输入时有空格;
{int i;
n=0;
memset(mark,0,sizeof(mark));
memset(G,0,sizeof(G));
memset(vis,0,sizeof(vis));
for(i=0;i<str[i];i++)if(str[i]!=' ')
{mark[str[i]-'a']=true;
n++;}
gets(str);
for( i=0;str[i];i++)if(str[i]!=' ')
{
int a,b;
a=str[i++]-'a';
while(str[i]==' ')
i++;
b=str[i]-'a';
G[a][b]=1;
}
dfs(0);
cout<<endl;//注意每次输出后都有一空行
}
return 0;}