poj1128 拓扑序(DFS)

题意:给出一张图,它是由一系列字母框按一定顺序从下到上摆放,因此上面的字母框会覆盖一部分下面的字母框,确保每个字母框的四条边都至少会出现一个点,要求输出所有可行的摆放顺序,字典序从小到大输出。

首先可以根据每个字母出现的位置确定每个字母的四条边,然后根据露出来的字母可以确定哪个字母在其他字母上面,所以就可以建出拓扑序的图,由于要输出所有解,所以需要 dfs 来解决,至于字典序只要按照 dfs 的遍历顺序从字母小的到字母大的就行了。

 #include<stdio.h>
#include<string.h> char s[][];
int l[],r[],u[],d[];
int ma[][],id[],n,vis[],v[];
char ans[]; void get(int i,int j,int k){
if(s[i][j]!='A'+k){
int c=s[i][j]-'A';
if(!ma[k][c]){
ma[k][c]=;
id[c]++;
}
}
} void dfs(int ss,int t){
ans[t]=ss+'A';
v[ss]=;
if(t==n){
for(int i=;i<=n;++i)printf("%c",ans[i]);
printf("\n");
v[ss]=;
return;
}
int que[],cnt=;
for(int i=;i<;++i){
if(ma[ss][i])id[i]--;
if(vis[i]&&!id[i]&&!v[i])que[++cnt]=i;
}
for(int i=;i<=cnt;++i)dfs(que[i],t+);
for(int i=;i<;++i)if(ma[ss][i])id[i]++;
v[ss]=;
} int main(){
int h,w;
while(scanf("%d%d",&h,&w)!=EOF){
n=;
memset(ma,,sizeof(ma));
for(int i=;i<;++i){
l[i]=u[i]=;
r[i]=d[i]=;
id[i]=vis[i]=v[i]=;
}
for(int i=;i<=h;++i)scanf("%s",s[i]+);
for(int i=;i<=h;++i){
for(int j=;j<=w;++j){
if(s[i][j]!='.'){
int c=s[i][j]-'A';
if(!vis[c]){
vis[c]=;
n++;
}
if(i<u[c])u[c]=i;
if(i>d[c])d[c]=i;
if(j<l[c])l[c]=j;
if(j>r[c])r[c]=j;
}
}
}
for(int k=;k<;++k){
if(l[k]==)continue;
int i,j;
i=u[k];
for(j=l[k];j<=r[k];++j)get(i,j,k);
i=d[k];
for(j=l[k];j<=r[k];++j)get(i,j,k);
j=l[k];
for(i=u[k]+;i<d[k];++i)get(i,j,k);
j=r[k];
for(i=u[k]+;i<d[k];++i)get(i,j,k);
}
for(int i=;i<;++i){
if(vis[i]&&!id[i])dfs(i,);
}
}
return ;
}
上一篇:poj1270 拓扑序(DFS)


下一篇:Swift的属性,方法,下标脚本以及继承