拓扑排序,没啥好说的,直接代码之! program Frame_Stacking; var data:array[0..30,0..30] of char; ans:array[0..30] of char; map:array['A'..'Z','A'..'Z'] of boolean; up,down,left,right,into:array['A'..'Z'] of longint; vis,use:array['A'..'Z'] of boolean; n,m,sum:longint; procedure prework; const inf=10000; begin sum:=0; filldword(left,sizeof(left) shr 2,inf); filldword(up,sizeof(up) shr 2,inf); fillchar(down,sizeof(down),0); fillchar(right,sizeof(right),0); fillchar(into,sizeof(into),0); fillchar(vis,sizeof(vis),0); fillchar(use,sizeof(use),0); fillchar(map,sizeof(map),0); end; procedure init; var i,j:longint; ch:char; begin readln(n,m); for i:=1 to n do begin for j:=1 to m do begin read(ch); data[i,j]:=ch; if ch='.' then continue; if not vis[ch] then begin vis[ch]:=true; inc(sum); end; if i<up[ch] then up[ch]:=i; if i>down[ch] then down[ch]:=i; if j<left[ch] then left[ch]:=j; if j>right[ch] then right[ch]:=j; end; readln; end; end; function topo(a,b:char):boolean; var i,j:longint; begin i:=up[a]; for j:=left[a] to right[a] do if data[i,j]=b then exit(true); i:=down[a]; for j:=left[a] to right[a] do if data[i,j]=b then exit(true); j:=left[a]; for i:=up[a] to down[a] do if data[i,j]=b then exit(true); j:=right[a]; for i:=up[a] to down[a] do if data[i,j]=b then exit(true); exit(false); end; procedure maketopo; var a,b:char; begin for a:='A' to 'Z' do if vis[a] then for b:='A' to 'Z' do if vis[b] and (a<>b) then if topo(a,b) then begin map[a,b]:=true; inc(into[b]); end; end; procedure outit; var i:longint; begin for i:=1 to sum do write(ans[i]); writeln; end; procedure dfs(dep:longint); var ch,cc:char; begin if dep>sum then begin outit; exit; end; for ch:='A' to 'Z' do if vis[ch] and not use[ch] and (into[ch]=0) then begin ans[dep]:=ch; use[ch]:=true; for cc:='A' to 'Z' do if map[ch,cc] then dec(into[cc]); dfs(dep+1); for cc:='A' to 'Z' do if map[ch,cc] then inc(into[cc]); use[ch]:=false; end; end; procedure main; begin maketopo; dfs(1); end; begin assign(input,'a.in'); reset(input); assign(output,'a.out'); rewrite(output); while not eof do begin prework; init; main; end; close(input); close(output); end.