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< ...
随机推荐
- 329 Longest Increasing Path in a Matrix 矩阵中的最长递增路径
Given an integer matrix, find the length of the longest increasing path.From each cell, you can eith ...
- [转]mysql视图学习总结
转自:http://www.cnblogs.com/wangtao_20/archive/2011/02/24/1964276.html 一.使用视图的理由是什么?1.安全性.一般是这样做的:创建一个 ...
- Mybatis的Dao向mapper传多个参数(三种解决方案)
第一种方案 : DAO层的函数方法 Public User selectUser(String name,String area); 对应的Mapper.xml <select id=" ...
- android shape stroke只绘制一边或者某几边
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android=" ...
- 接口测试(一)--soapui实践
一.接口的概念 接口是指系统模块与模块或系统与系统之间进行交互,一般用的多的是HTTP协议的接口.webService协议的接口,还有RPC的接口. RPC:Remote Procedure Call ...
- html——行内元素、块元素、行内块元素
行内元素:span ,a, ,strong , em, del, ins.特点:在一行上显示:不能直接设置宽高:元素的宽和高就是内容撑开的宽高. 块元素:div,h1-h6,p,ul,li.特 ...
- eclipse安装python开发pydev插件
eclipse安装python开发pydev插件 下载eclipse的python开发插件pydev http://pan.baidu.com/s/1qXHt8pI 下载python.exe,并安装. ...
- Java_Web三大框架之Hibernate操作数据库(三)
使用Hibernate操作数据库需要七个步骤: (1)读取并解析配置文件 Configuration conf = newConfiguration().configure(); (2)读取并解析映射 ...
- rxswift-self.usernameTF.rx.text.orEmpty.map
self.usernameTF.rx.text.orEmpty.map 一堆类型转化+数据处理的操作 self.usernameTF.rx:将textfiled用Reactive封装: .text:监 ...
- centos 设置 ip地址
linux设置ip,主要是修改/etc/sysconfig/network-scripts/ifcfg-** 里面的网卡配置文件,然后命令 service network restart 生效 自动获 ...