Frame Stacking
poj1128:http://poj.org/problem?id=1128
题意:一个二维图里面有几个相框(四条边的空心矩形框)。有重叠,求重叠顺序。还有题目保证至少存在一种符合要求的序列,当有多种情况时按字典序由小到大输出所有的情况。
题解:建图然后+topsort+dfs ,建图很麻烦的,要细心处理。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include <iterator>//stl迭代器
using namespace std;
char map[][];//记录原图
int g[][];//topsort的图
int counts[];//记录入度
int n,m,num;// 行和列 以及出现过的字母的个数
bool visit[];//记录出现过的字母
vector<char> ans;//记录结果
struct Node{
int x1,y1;
int x2,y2;
}edge[];//储存每个节点出现的最左,最右,最上,最下的坐标。
void init(){
num=;//初始化
memset(g,,sizeof(g));
memset(map,,sizeof(map));
for(int i=;i<=;i++){
counts[i]=;
visit[i]=false;
edge[i].x1=edge[i].y1=;
edge[i].x2=edge[i].y2=-;
}
}
void build1(){//建图
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
cin>>map[i][j];
if(map[i][j]!='.'){
if(!visit[map[i][j]-'A'+]){
num++;
visit[map[i][j]-'A'+]=true;
}//统计出现过的字母
if(edge[map[i][j]-'A'+].x1>i){
edge[map[i][j]-'A'+].x1=i;
}
if(edge[map[i][j]-'A'+].y1>j){
edge[map[i][j]-'A'+].y1=j;
}
if(edge[map[i][j]-'A'+].x2<i){
edge[map[i][j]-'A'+].x2=i;
}
if(edge[map[i][j]-'A'+].y2<j){
edge[map[i][j]-'A'+].y2=j;
}//不断更新各个图片的上下左右的值 }
}
}
void build2(){//开始建topsort的图g
for(int i=;i<=;i++){
if(visit[i]){//如果出现过
for(int j=edge[i].y1;j<=edge[i].y2;j++){//遍历第一行(最上面的一行)找出与该图不同的图,如果不同
if(map[edge[i].x1][j]!=i+'A'-&&!g[i][map[edge[i].x1][j]-'A'+]){
g[i][map[edge[i].x1][j]-'A'+]=;//如果没有建边,而且满足覆盖关系
counts[map[edge[i].x1][j]-'A'+]++;
}
}
for(int j=edge[i].y1;j<=edge[i].y2;j++){//最下面的一行
if(map[edge[i].x2][j]!=i+'A'-&&!g[i][map[edge[i].x2][j]-'A'+]){
g[i][map[edge[i].x2][j]-'A'+]=;
counts[map[edge[i].x2][j]-'A'+]++;
}
}
for(int j=edge[i].x1;j<=edge[i].x2;j++){//最左边的一列
if(map[j][edge[i].y1]!=i+'A'-&&!g[i][map[j][edge[i].y1 ]-'A'+]){
g[i][map[j][edge[i].y1]-'A'+]=;
counts[map[j][edge[i].y1]-'A'+]++;
}
}
for(int j=edge[i].x1;j<=edge[i].x2;j++){//最右边的一列
if(map[j][edge[i].y2]!=i+'A'-&&!g[i][map[j][edge[i].y2]-'A'+]){
g[i][map[j][edge[i].y2]-'A'+]=;
counts[map[j][edge[i].y2]-'A'+]++;
}
}
}
}
}
void topo(int depth, int count){//排序,depth记录已经处理的字符的个数,count为总的字符个数 if (depth >= count){//达到开始值就开始输出
copy(ans.begin(), ans.end(), ostream_iterator<char>(cout));
cout << endl;
return;
}//
for (int i = ; i <=; ++i){
if(visit[i]){
if (counts[i] == ){
ans.push_back(i+'A'-);
counts[i] = -;
for (int k = ; k <=; ++k){
if (g[i][k] == ){
counts[k]--;
}
}
//递归向下
topo(depth+, count);
ans.pop_back();//恢复现场1是ans里面的值要删除,2是各个点的入度要恢复+1;
counts[i] = ;
for (int k = ; k <=; ++k){
if (g[i][k] == ){
counts[k]++;
}
}
}
}
}
}
int main(){
while(~scanf("%d%d",&n,&m)){
init();
ans.clear();//清除
build1();
build2();
topo(,num);//从0开始
}
}
Frame Stacking的更多相关文章
- Frame Stacking(拓扑排序)
题目链接:http://acm.tju.edu.cn/toj/showp1076.html1076. Frame Stacking Time Limit: 1.0 Seconds Memory ...
- POJ 1128 Frame Stacking(拓扑排序·打印字典序)
题意 给你一些矩形框堆叠后的鸟瞰图 推断这些矩形框的堆叠顺序 每一个矩形框满足每边都至少有一个点可见 输入保证至少有一个解 按字典序输出全部可行解 和上一题有点像 仅仅是这个要打印全部的可行 ...
- Frame Stacking ZOJ 1083,poj 1128
Frame Stacking Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4034 Accepted: 1352 De ...
- Frame Stacking 框架堆叠
/* [题目来源]http://poj.org/problem?id=1128 [题目分析] 几张图片叠在一起,给出堆叠后的情况,要求出所有可能的从下到上的堆叠顺序. [思路分析] 1.题目已经很明确 ...
- POJ1128 Frame Stacking(拓扑排序+dfs)题解
Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ ... ...
- POJ 1128 Frame Stacking (拓扑排序)
题目链接 Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ ...
- Frame Stacking 拓扑排序 图论
Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ .... ...
- zoj 1083 Frame Stacking
其实就是一个拓补排序.(动态记录第i个之上的j存不存在,反过来就是第j个之下的i) 首先确立每个框的位置(题目明确说了每一边都不会被完全覆盖)./*可以通过搜索,搜索到该框的所有四个角*/||如果题目 ...
- POJ1128 Frame Stacking(拓扑排序)
题目链接:http://poj.org/problem?id=1128 题意:给你一个平面,里面有些矩形(由字母围成),这些矩形互相有覆盖关系,请从求出最底层的矩形到最上层的矩形的序列,如果存在多种序 ...
随机推荐
- rsyslog官方文档
http://www.rsyslog.com/doc/v8-stable/configuration/index.html
- Linux命令之dot - 绘制DOT语言脚本描述的图形
本文链接:http://codingstandards.iteye.com/blog/840055 用途说明 Graphviz (Graph Visualization Software的缩写)是一个 ...
- Qt 学习之路:Canvas
在 QML 刚刚被引入到 Qt 4 的那段时间,人们往往在讨论 Qt Quick 是不是需要一个椭圆组件.由此,人们又联想到,是不是还需要其它的形状?这种没玩没了的联想导致了一个最直接的结果:除了圆角 ...
- 一个Web Project引用多个Java Project在Eclipse下的配置--转载
项目结构: 项目由一个Web Project和多个Java Project构成,Web Project需要引用其它Java Project的类和Jar包.开发时用Eclipse3.5和Tomcat调试 ...
- SSL 错误
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? at com.sun.net.ssl.in ...
- HTML5之填写个人信息
- css 选择符
css参考手册:css.doyoe.com 在css3中,不同的浏览器可能需要不同的前缀,它表示该css属性或规则尚未成为W3C标准的一部分,是浏览器的私有属性,虽然目前较新版本的浏览器都是不需要前缀 ...
- 原生JS添加节点方法与jQuery添加节点方法的比较及总结
一.首先构建一个简单布局,来供下边讲解使用 1.HTML部分代码: <div id="div1">div1</div> <div id="d ...
- linux进程地址空间详解(转载)
linux进程地址空间详解(转载) 在前面的<对一个程序在内存中的分析 >中很好的描述了程序在内存中的布局,这里对这个结果做些总结和实验验证.下面以Linux为例(实验结果显示window ...
- 多线程lock(instance)中instance的选择.
如我的提问:http://bbs.csdn.net/topics/390496351?page=1#post-394837834 拥有类原子功能的类: class ShareState { //原子功 ...