/*一直对深搜中的回溯不是很理解。
用这个题来加深一下吧。
先用下hash,在排序。
对于不在拓扑排序中出现的点,在统计中的入度也为0,如案例1中的g,
这样在深搜的过程中按照字典序进行排列即可。
*/
#include <stdio.h>
#include <cstring>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
char a[21];
int b[21],in[21];
char r[21];
bool m[21][21];
map <char,int> mp;
int n,num;
void topsort()
{
if(num==n)
{
printf("%s\n",r);
return ;
}
for(int i=0; i<n; i++)
{
if(in[i]==0)
{
r[num++]=a[i];
in[i]--;
for(int j=0; j<n; j++)
{
if(m[i][j])
in[j]--;
}
topsort();
num--;
in[i]++;
for(int j=0; j<n; j++)
{
if(m[i][j])
in[j]++;
}
}
}
}
int main()
{
char s[110];
int ca=0;
while(gets(s))
{
n=0;
memset(m,false,sizeof(m));
memset(in,0,sizeof(in));
memset(r,0,sizeof(r));
mp.clear();
if(ca!=0)
printf("\n");
ca=1;
for(int i=0; i<strlen(s); i++)
{
if(s[i]>='a'&&s[i]<='z')
a[n++]=s[i];
}
sort(a,a+n);
for(int i=0; i<n; i++)
mp[a[i]]=i;
num=0;
gets(s);
bool ret=false;
int tmp;
for(int i=0; i<strlen(s); i++)
{
if(s[i]>='a'&&s[i]<='z'&&!ret)
{
tmp=mp[s[i]];
ret=true;
continue;
}
if(s[i]>='a'&&s[i]<='z'&&ret)
{
int t=mp[s[i]];
ret=false;
m[tmp][t]=true;
in[t]++;
}
}
topsort();
}
return 0;
}
Following Orders hoj poj 拓扑序+字典序
最新推荐文章于 2021-05-31 16:06:45 发布