Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 4112 | Accepted: 1380 |
Description
........ ........ ........ ........ .CCC.... EEEEEE.. ........ ........ ..BBBB.. .C.C.... E....E.. DDDDDD.. ........ ..B..B.. .C.C.... E....E.. D....D.. ........ ..B..B.. .CCC.... E....E.. D....D.. ....AAAA ..B..B.. ........ E....E.. D....D.. ....A..A ..BBBB.. ........ E....E.. DDDDDD.. ....A..A ........ ........ E....E.. ........ ....AAAA ........ ........ EEEEEE.. ........ ........ ........ ........ 1 2 3 4 5
.CCC.... ECBCBB.. DCBCDB.. DCCC.B.. D.B.ABAA D.BBBB.A DDDDAD.A E...AAAA EEEEEE..
Input
Output
Sample Input
9 8 .CCC.... ECBCBB.. DCBCDB.. DCCC.B.. D.B.ABAA D.BBBB.A DDDDAD.A E...AAAA EEEEEE..
Sample Output
EDABC
Source
题意:ASC码顺序排出可能的像框排列顺序
分析:建图->dfs,建图时扫描每个相框的边界有其他字母则建一条边(不要有重边),统计每个节点的入度,然后dfs每次取一入度为零的节点,并将该节点的子节点入度减一,重复dfs此动作,记得dfs后还原入度
这题吧看着像是拓补,但拓扑还真搞不定,解法只有拓扑的建边部分再加dfs
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #include <algorithm> #define mod 1000000009 #define INF 0x3f3f3f3f #define pi acos(-1.0) #define eps 1e-6 #define LL long long #define MAXN 55 #define MAXM 2005 using namespace std; char g[35][35]; int cnt,ecnt,first[MAXN],h[MAXN],minx[MAXN],maxx[MAXN],miny[MAXN],maxy[MAXN]; int nex[MAXM],v[MAXM]; bool gv[MAXN][MAXN]; void add_(int a,int b) { v[ecnt]=b; nex[ecnt]=first[a]; first[a]=ecnt++; } void slove() { int i,j,k;cnt=0; memset(h,-1,sizeof h);//入度 memset(gv,0,sizeof gv); for(k=0;k<26;k++) if(minx[k]!=30) { if(h[k]==-1)h[k]=0; cnt++; for(i=minx[k];i<=maxx[k];i++) for(j=miny[k];j<=maxy[k];j=i!=minx[k]&&i!=maxx[k]&&j==miny[k]?maxy[k]:j+1) { if(g[i][j]=='.'||g[i][j]=='A'+k)continue; int tmp=g[i][j]-'A'; if(!gv[k][tmp]) { add_(k,tmp); gv[k][tmp]=1; if(h[tmp]==-1)h[tmp]=1; else h[tmp]++; } } } } void dfs(int place,string ans) { int i,e; if(place==cnt) { cout<<ans<<endl; return ; } for(i=0;i<26;i++) if(!h[i]) { h[i]=-1; for(e=first[i];~e;e=nex[e]) h[v[e]]--; char c='A'+i; dfs(place+1,ans+c); h[i]=0; for(e=first[i];~e;e=nex[e]) h[v[e]]++; } } int main() { int n,m,i,j,k; while(~scanf("%d%d",&n,&m)) { for(i=0;i<n;i++) scanf("%s",g[i]); memset(first,-1,sizeof first); ecnt=0; for(i=0;i<26;i++) { maxx[i]=maxy[i]=0; minx[i]=miny[i]=30; } for(i=0;i<n;i++) for(j=0;j<m;j++) if(g[i][j]!='.') { int tmp=g[i][j]-'A'; maxx[tmp]=max(maxx[tmp],i); minx[tmp]=min(minx[tmp],i); maxy[tmp]=max(maxy[tmp],j); miny[tmp]=min(miny[tmp],j); } slove(); string ans=""; dfs(0,ans); } return 0; }