码迷,mamicode.com
首页 > 其他好文 > 详细

重叠的方框 frame

时间:2016-09-15 13:36:41      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

重叠的方框 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 }
View Code

 

重叠的方框 frame

标签:

原文地址:http://www.cnblogs.com/cnblogsLSY/p/5874630.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!