这个题的意思是说,按照字符串的输入顺序重新编排字典序。前一个字符串与后一个字符串相比较,只要出现不同的了就把前一个字符串的字母指向后一个字符串的字母,如果符合情况的话就用拓扑排序把重新编排后的26个字母输出,否则输出
Impossible
#include <stdio.h> #include <string.h> char st[1000][1000]; int map[100][100]; int num[100],queue[100]; void toposort() { int i,j,x,c=0; for(i=0; i<26; i++) { int f=1; for(j=0; j<26; j++) { if(num[j]==0) { num[j]=-1; x=j; f=0; break; } } if(f) //这种情况是判断目前是否已成环,如果成环了则没有入度为0的点了 break; queue[c++]=x; for(j=0; j<26; j++) { if(map[x][j]==1) { map[x][j]=0; num[j]--; } } } if(c<26) printf("Impossible\n"); else { for(i=0; i<c; i++) { printf("%c",queue[i]+'a'); } printf("\n"); } } int main() { int n,i,j,x,y; while(~scanf("%d",&n)) { memset(map,0,sizeof(map)); //记得清零 memset(num,0,sizeof(num)); memset(queue,0,sizeof(queue)); int flag=0; for(i=0; i<n; i++) scanf("%s",st[i]); for(i=1; i<n; i++) { int len1=strlen(st[i-1]); int len2=strlen(st[i]); if(len1>len2) { for(j=0; st[i-1][j]!='\0'; j++) { if(j==len2) { flag=1; //用来判断(第一行aaa 第二行a)这种情况的 break; } if(st[i-1][j]!=st[i][j]) { x=st[i-1][j]-'a'; y=st[i][j]-'a'; if(!map[x][y]) //开始构建图 { map[x][y]=1; num[y]++; } break; } } } else if(len1<len2) { for(j=0; st[i][j]!='\0'; j++) { if(j==len1) break; if(st[i-1][j]!=st[i][j]) { x=st[i-1][j]-'a'; y=st[i][j]-'a'; if(!map[x][y]) { map[x][y]=1; num[y]++; } break; } } } else { for(j=0; st[i][j]!='\0'; j++) { if(st[i-1][j]!=st[i][j]) { x=st[i-1][j]-'a'; y=st[i][j]-'a'; if(!map[x][y]) { map[x][y]=1; num[y]++; } break; } } } } if(flag==1) { printf("Impossible\n"); continue; } toposort(); } }