POJ 1128 Frame Stacking(拓扑排序·打印字典序)
题意 给你一些矩形框堆叠后的鸟瞰图 推断这些矩形框的堆叠顺序 每一个矩形框满足每边都至少有一个点可见 输入保证至少有一个解 按字典序输出全部可行解
和上一题有点像 仅仅是这个要打印全部的可行方案 建图还是类似 由于每一个矩形框的四边都有点可见 所以每一个矩形框的左上角和右下角的坐标是能够确定的 然后一个矩形框上有其他字符时 就让这个矩形框相应的字符和那个其他字符建立一个小于关系 由于要打印方案 所以在有多个入度为0的点时须要用DFS对每种选择都进行一遍拓扑排序
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 50;
char ans[N], g[N][N], tp[N][N];
int x1[N], y1[N], x2[N], y2[N];
//(x1,y1)为相应字母的左上角坐标 (x2,y2)为右下
int in[N], n; void addTopo(int i, int j, int c)
{
int t = g[i][j] - 'A';
if(t != c && !tp[c][t])
{
++in[t];
tp[c][t] = 1;
}
} void build()
{
memset(tp, 0, sizeof(tp)); //tp[i][j] = 1表示有i < j的关系
for(int c = n = 0; c < 26; ++c)
{
if(in[c] < 0) continue;
for(int i = x1[c]; i <= x2[c]; ++i)
{
addTopo(i, y1[c], c);
addTopo(i, y2[c], c);
}
for(int j = y1[c]; j <= y2[c]; ++j)
{
addTopo(x1[c], j, c);
addTopo(x2[c], j, c);
}
++n;//统计出现了多少个字符
}
} void topoSort(int k)
{
if(k == n)
{
ans[k] = 0;
puts(ans);
return;
} //从前往后找入度为0的点保证升序
for(int i = 0; i < 26; ++i)
{
if(in[i] == 0)
{
ans[k] = i + 'A'; //这一位放i
in[i] = -1;
for(int j = 0; j < 26; ++j)
if(tp[i][j]) --in[j]; topoSort(k + 1); //找下一位 in[i] = 0; //回溯
for(int j = 0; j < 26; ++j)
if(tp[i][j]) ++in[j];
}
}
} int main()
{
int h, w, c;
while(~scanf("%d%d", &h, &w))
{
for(int i = 0; i < 26; ++i)
{
x1[i] = y1[i] = N;
x2[i] = y2[i] = 0;
} memset(in, -1, sizeof(in));
for(int i = 0; i < h; ++i)
{
scanf("%s", g[i]);
for(int j = 0; j < w; ++j)
{
if((c = g[i][j] - 'A') < 0) continue; //g[i][j] ='.'
if(i < x1[c]) x1[c] = i;
if(i > x2[c]) x2[c] = i;
if(j < y1[c]) y1[c] = j;
if(j > y2[c]) y2[c] = j;
in[c] = 0; //出现过的字母in初始为0 否则为-1
}
}
build();
topoSort(0);
}
return 0;
}
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
Now place them on top of one another starting with 1 at the bottom and ending up with 5 on top. If any part of a frame covers another it hides that part of the frame below.
Viewing the stack of 5 frames we see the following.
.CCC.... ECBCBB.. DCBCDB.. DCCC.B.. D.B.ABAA D.BBBB.A DDDDAD.A E...AAAA EEEEEE..
In what order are the frames stacked from bottom to top? The answer is EDABC.
Your problem is to determine the order in which the frames are stacked from bottom to top given a picture of the stacked frames. Here are the rules:
1. The width of the frame is always exactly 1 character and the sides are never shorter than 3 characters.
2. It is possible to see at least one part of each of the four sides of a frame. A corner shows two sides.
3. The frames will be lettered with capital letters, and no two frames will be assigned the same letter.
Input
Your input may contain multiple blocks of the format described above, without any blank lines in between. All blocks in the input must be processed sequentially.
Output
There will always be at least one legal ordering for each input block. List the output for all blocks in the input sequentially, without any blank lines (not even between blocks).
Sample Input
9
8
.CCC....
ECBCBB..
DCBCDB..
DCCC.B..
D.B.ABAA
D.BBBB.A
DDDDAD.A
E...AAAA
EEEEEE..
Sample Output
EDABC
POJ 1128 Frame Stacking(拓扑排序·打印字典序)的更多相关文章
- POJ 1128 Frame Stacking (拓扑排序)
题目链接 Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ ...
- POJ 1128 Frame Stacking 拓扑排序+暴搜
这道题输出特别坑.... 题目的意思也不太好理解.. 就解释一下输出吧.. 它让你 从下往上输出. 如果有多种情况,按照字典序从小往大输出... 就是这个多种情况是怎么产生的呢. 下面给一组样例. 很 ...
- Frame Stacking 拓扑排序 图论
Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ .... ...
- POJ 2367 (裸拓扑排序)
http://poj.org/problem?id=2367 题意:给你n个数,从第一个数到第n个数,每一行的数字代表排在这个行数的后面的数字,直到0. 这是一个特别裸的拓扑排序的一个题目,拓扑排序我 ...
- poj 3687 Labeling Balls(拓扑排序)
题目:http://poj.org/problem?id=3687题意:n个重量为1~n的球,给定一些编号间的重量比较关系,现在给每个球编号,在符合条件的前提下使得编号小的球重量小.(先保证1号球最轻 ...
- [ACM] POJ 3687 Labeling Balls (拓扑排序,反向生成端)
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10161 Accepted: 2810 D ...
- poj 2762(强连通分量+拓扑排序)
题目链接:http://poj.org/problem?id=2762 题意:给出一个有向图,判断任意的两个顶点(u,v)能否从u到达v,或v到达u,即单连通,输出Yes或No. 分析:对于同一个强连 ...
- POJ 2585.Window Pains 拓扑排序
Window Pains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1888 Accepted: 944 Descr ...
- POJ 1270 Following Orders 拓扑排序
http://poj.org/problem?id=1270 题目大意: 给你一串序列,然后再给你他们部分的大小,要求你输出他们从小到大的所有排列. 如a b f g 然后 a<b ,b< ...
随机推荐
- python中set元素为可迭代元素相加
#a 与 b必须是两个相同类型的可迭代对象 a = "1" b = "2" print(set(a + b)) # {'1', '2'} a = " ...
- BZOJ 4304 tarjan+topsort+bitset
我就是想骗一骗访问量 先Tarjan搞出来所有的强连通分量 正向连边 反向连边 topsort一发 搞出来每个点可以到哪些点 和哪些点可以到这个点 对于每条边 与一下 就是答案 //By Siri ...
- build.gradle(Mdule.app)依赖库相关
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //noinspection GradleCompati ...
- Json解析与Gson解析
本文主要介绍json最原始的解析与google提供的gson工具类解析 ①json解析 /** * 普通的json解析 * @param s * @throws JSONException */ pr ...
- html5——伸缩布局
基本概念 1.主轴:Flex容器的主轴主要用来配置Flex项目,默认是水平方向 2.侧轴:与主轴垂直的轴称作侧轴,默认是垂直方向的 3.方向:默认主轴从左向右,侧轴默认从上到下 4.主轴和侧轴并不是固 ...
- 常用MySQL语句整合
常用MySQL语句整合 1. MySQL服务的配置和使用 修改MySQL管理员的口令:mysqladmin –u root password 密码字符串 如:mysqldmin –u root pas ...
- GitHub代码托管平台搭建
GitHub代码托管平台搭建 注册账户以及创建仓库 要想使用github第一步当然是注册github账号了, github官网地址:https://github.com/. 之后就可以创建仓库了(免费 ...
- ats 与 https
一些证书相关的描述: https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKe ...
- eclipse的任务列表
如上图所示,备注加 TODO ,可以在tasks列表中显示,提示你还有哪些工作需要完善 昨天遇到一个问题,加了 TODO 任务列表里却不显示,后来发现是因为任务列表只显示了前100条,而我的项 ...
- django 加日志
LOGGING = { 'version': 1, 'disable_existing_loggers': False, # 指定输出的格式,被handler使用. 'formatters': { ' ...