标签:
重叠的方框 frame
【题目描述】:
|
|
|
|
|
|
|
|
E |
E |
E |
E |
E |
E |
|
|
E |
|
|
|
|
E |
|
|
E |
|
|
|
|
E |
|
|
E |
|
|
|
|
E |
|
|
E |
|
|
|
|
E |
|
|
E |
|
|
|
|
E |
|
|
E |
|
|
|
|
E |
|
|
E |
E |
E |
E |
E |
E |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D |
D |
D |
D |
D |
D |
|
|
D |
|
|
|
|
D |
|
|
D |
|
|
|
|
D |
|
|
D |
|
|
|
|
D |
|
|
D |
D |
D |
D |
D |
D |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
下图为5个放置在9x8 的点阵中的方框图:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A |
A |
A |
A |
|
|
|
|
A |
|
|
A |
|
|
|
|
A |
|
|
A |
|
|
|
|
A |
A |
A |
A |
|
|
|
|
|
|
|
|
|
C |
C |
C |
|
|
|
|
|
C |
|
C |
|
|
|
|
|
C |
|
C |
|
|
|
|
|
C |
C |
C |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
B |
B |
B |
B |
|
|
|
|
B |
|
|
B |
|
|
|
|
B |
|
|
B |
|
|
|
|
B |
|
|
B |
|
|
|
|
B |
B |
B |
B |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
下图是这5个框叠放起来的图形:
.CCC....
ECBCBB..
DCBCDB..
DCCC.B..
D.B.ABAA
D.BBBB.A
DDDDAD.A
E...AAAA
EEEEEE..
那么这些方框从下至上叠放的顺序是什么呢?
答案是: EDABC.
你的任务是对于一个给定的方框叠放以后的图形, 找出他们从下至上的叠放顺序.
下面是一些规则:
(1). 方框的边宽度为一个字符,边长不少于3个字符;
(2). 每个方框的4条边都有一部分可见, 一个角代表两条边;
(3). 方框用大写字母了表示, 没有两个方框用相同的字符来表示.
【输入描述】:
前两行每行一个数字,分别表示长、宽。
接下来为框叠起来的图。没有框的地方用‘.‘表示。
【输出描述】:
输出全部可能情况。
按字典顺序排序。
【样例输入】 |
【样例输出】 |
9 8 .CCC.... ECBCBB.. DCBCDB.. DCCC.B.. D.B.ABAA D.BBBB.A DDDDAD.A E...AAAA EEEEEE.. |
EDABC |
【数据范围及描述】:
点阵宽高不操过10
方框数量不操过10
这道题看起来很复杂,其实并非搜索,考察的是拓扑排序!
难点在于建立拓扑图----DAG图。
最后呢生成所有拓扑排序就可以了!
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <string> 6 using namespace std; 7 8 const int maxn=12; 9 char g[maxn][maxn]; 10 int Ind[30]; 11 int Head[30],Next[900],Adj[900]; 12 bool vis[30]; 13 string ans[10000]; 14 int anslen; 15 int N,M,c; 16 17 void AddEdge(int u,int v) 18 { 19 c++; 20 Adj[c]=v; 21 Next[c]=Head[u]; 22 Head[u]=c; 23 } 24 25 void topsort(string p) 26 { 27 bool flag=false; 28 for(int i=1;i<=26;i++) 29 { 30 if(Ind[i]==0) 31 { 32 flag=true; 33 Ind[i]=-1; 34 // cout<<p+(char)(i+‘A‘-1)<<endl; 35 for(int j=Head[i];j;j=Next[j]) 36 Ind[Adj[j]]--; 37 topsort(p+(char)(i+‘A‘-1)); 38 for(int j=Head[i];j;j=Next[j]) 39 Ind[Adj[j]]++; 40 Ind[i]=0; 41 } 42 } 43 if(!flag) 44 { 45 anslen++; 46 for(int i=p.length()-1;i>=0;i--) 47 ans[anslen]+=p[i]; 48 } 49 } 50 51 int main() 52 { 53 cin>>N>>M; 54 scanf("\n"); 55 memset(Ind,-1,sizeof(Ind)); 56 for(int i=1;i<=N;i++) 57 gets(g[i]+1); 58 for(int a=1;a<=26;a++) 59 { 60 int X,Y,rl,cl; 61 char ch=‘A‘+a-1; 62 X=Y=20;rl=cl=-1; 63 for(int i=1;i<=N;i++) 64 { 65 for(int j=1;j<=M;j++) 66 { 67 if(g[i][j]==ch) 68 { 69 X=min(X,i); 70 Y=min(Y,j); 71 rl=max(rl,i); 72 cl=max(cl,j); 73 } 74 } 75 } 76 if(X==20) continue; 77 Ind[a]++; 78 memset(vis,false,sizeof(vis)); 79 vis[a]=true; 80 for(int i=X;i<=rl;i++) 81 { 82 for(int j=Y;j<=cl;j++) 83 { 84 if(i!=X&&i!=rl&&j!=Y&&j!=cl) continue; 85 if(!vis[g[i][j]-‘A‘+1]) 86 { 87 if(Ind[ch-‘A‘+1]==-1) Ind[ch-‘A‘+1]++; 88 vis[g[i][j]-‘A‘+1]=true; 89 AddEdge(g[i][j]-‘A‘+1,ch-‘A‘+1); 90 Ind[ch-‘A‘+1]++; 91 } 92 } 93 } 94 } 95 string str; 96 topsort(str); 97 sort(ans+1,ans+anslen+1); 98 for(int i=1;i<=anslen;i++) 99 cout<<ans[i]<<endl; 100 return 0; 101 }
标签:
原文地址:http://www.cnblogs.com/cnblogsLSY/p/5874630.html