图论之拓扑排序 poj1128 Frame Stacking
题目网址 http://poj.org/problem?id=1128
思路:遍历找出每一种字母出现的最大和最小的横纵坐标,假如本应出现字母A的地方出现了字母B,那么A一定在字母B之前,这就相当于点A到点B有一条有向边,这样就可以建立一张图进行拓扑排序(拓扑排序不唯一,这里题目还要求输出所有结果,这里就进行简单的深度优先搜索)。
#include<cstdio>
#include<cstring>
using namespace std;
struct point
{
int maxi,maxj,mini,minj;
} a[]; //记录一种字母出现的最大最小坐标
int n,m;
int mark[]; //记录哪些字母出现过
char map[][]; //记录原始地图
int in[]; //记录每种字母的入度
int rec[][]; //临接矩阵记录边
int num[]; //记录答案
int depth; //记录搜索的深度
void init() //寻找每种字母出现的最大最小坐标
{
for(int i=; i<; i++)
if(mark[i]==)
{
int max_i=-,max_j=-,min_i=,min_j=;
for(int j=; j<n; j++)
for(int k=; k<m; k++)
if(map[j][k]-'A'==i)
{
if(max_i<j)
max_i=j; if(min_i>j)
min_i=j; if(max_j<k)
max_j=k; if(min_j>k)
min_j=k;
}
a[i].maxi=max_i;
a[i].maxj=max_j;
a[i].mini=min_i;
a[i].minj=min_j;
}
return ;
}
void check() //记录边
{
for(int i=; i<n; i++)
if(mark[i])
{
for(int j=a[i].mini; j<=a[i].maxi; j++)
{
if(map[j][a[i].maxj]!=i+'A')
if(rec[map[j][a[i].maxj]-'A'][i]==)
{
rec[map[j][a[i].maxj]-'A'][i]=;
in[map[j][a[i].maxj]-'A']++;
}
if(map[j][a[i].minj]!=i+'A')
if(rec[map[j][a[i].minj]-'A'][i]==)
{
rec[map[j][a[i].minj]-'A'][i]=;
in[map[j][a[i].minj]-'A']++;
}
}
for(int j=a[i].minj; j<=a[i].maxj; j++)
{
if(map[a[i].maxi][j]!=i+'A')
if(rec[map[a[i].maxi][j]-'A'][i]==)
{
rec[map[a[i].maxi][j]-'A'][i]=;
in[map[a[i].maxi][j]-'A']++;
}
if(map[a[i].mini][j]!=i+'A')
if(rec[map[a[i].mini][j]-'A'][i]==)
{
rec[map[a[i].mini][j]-'A'][i]=;
in[map[a[i].mini][j]-'A']++;
}
}
}
return ;
}
void print_num(int Cout) //输出答案
{
for(int i=; i<Cout; i++)
printf("%c",num[i]+'A');
puts("");
}
void topo_sort(int Cout) //拓扑加深搜
{
if(depth==Cout)
{
print_num(Cout);
return ;
}
for(int i=; i<; i++)
if(in[i]==&&mark[i])
{
num[depth]=i;
depth++;
in[i]=-;
for (int k = ; k < ; k++)
{
if (rec[k][i]==)
{
in[k]--;
}
}
topo_sort(Cout);
for (int k = ; k < ; k++)
{
if (rec[k][i] == )
{
in[k]++;
}
}
in[i]=;
depth--;
}
return ;
} int main()
{
while(~scanf("%d%d",&n,&m))
{
getchar();
memset(in,,sizeof(in)); //初始化
memset(rec,,sizeof(rec));
memset(map,,sizeof(map));
memset(mark,,sizeof(mark));
memset(num,,sizeof(num));
for(int i=; i<n; i++)
gets(map[i]);
for(int i=; i<n; i++)
for(int j=; j<m; j++)
mark[map[i][j]-'A']=;
init();
check();
int Cout=;
depth=;
for(int i=; i<; i++) //计算一共出现了几个字母
if(mark[i])Cout++;
topo_sort(Cout);
}
return ;
}
图论之拓扑排序 poj1128 Frame Stacking的更多相关文章
- POJ1128 Frame Stacking(拓扑排序+dfs)题解
Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ ... ...
- POJ1128 Frame Stacking(拓扑排序)
题目链接:http://poj.org/problem?id=1128 题意:给你一个平面,里面有些矩形(由字母围成),这些矩形互相有覆盖关系,请从求出最底层的矩形到最上层的矩形的序列,如果存在多种序 ...
- 图论之拓扑排序 poj 2367 Genealogical tree
题目链接 http://poj.org/problem?id=2367 题意就是给定一系列关系,按这些关系拓扑排序. #include<cstdio> #include<cstrin ...
- UVA - 1572 Self-Assembly(图论模型+拓扑排序)
题意:判断利用给出的正方形是否能拼接出无限延伸的结构. 分析:正方形上的字母看做点,正方形看做有向边. 例如: 若上下两个正方形能拼接,需要B+~C+是个有向边. 对输入的处理是:把A+,A-分别映射 ...
- tsort - 拓扑排序
tsort - 拓扑排序 本文链接:http://codingstandards.iteye.com/blog/834572 (转载请注明出处) 用途说明 tsort命令通常用于解决一种逻辑问题, ...
- Frame Stacking(拓扑排序)
题目链接:http://acm.tju.edu.cn/toj/showp1076.html1076. Frame Stacking Time Limit: 1.0 Seconds Memory ...
- POJ 1128 Frame Stacking(拓扑排序·打印字典序)
题意 给你一些矩形框堆叠后的鸟瞰图 推断这些矩形框的堆叠顺序 每一个矩形框满足每边都至少有一个点可见 输入保证至少有一个解 按字典序输出全部可行解 和上一题有点像 仅仅是这个要打印全部的可行 ...
- POJ 1128 Frame Stacking (拓扑排序)
题目链接 Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ ...
- ACM/ICPC 之 拓扑排序+DFS(POJ1128(ZOJ1083)-POJ1270)
两道经典的同类型拓扑排序+DFS问题,第二题较第一题简单,其中的难点在于字典序输出+建立单向无环图,另外理解题意是最难的难点,没有之一... POJ1128(ZOJ1083)-Frame Stacki ...
随机推荐
- ansible-yum
#yum 需要在vim /etc/ansible/hosts里面给执行的主机配置 远程调用python的路径不知道为什么默认值认识python2.6.6 vim /etc/ansible/hosts ...
- kubernetes对接第三方认证
kubernetes对接第三方认证 kubernetes离线安装包地址 概述 本文介绍如何使用github账户去关联自己kubernetes账户.达到如下效果: 使用github用户email作为ku ...
- HashMap常见面试题整理
花了三天时间来仔细阅读hashMap的源码,期间补了下不少数据结构的知识,刷了不少相关的面试题并进行了整理 1.谈一下HashMap的特性? 1.HashMap存储键值对实现快速存取,允许为null. ...
- 爬虫获取搜狐汽车的配置信息 和swf动态图表的销量数据-------详细教学
前情提要:需要爬取搜狐汽车的所有配置信息,具体配置对应的参数. 以及在动态图表上的历史销量. 比如: 一汽奥迪旗下Q5L 的<40 TFSI 荣享进取型 国VI >的历史销量和该配置的参数 ...
- koa2基于stream(流)进行文件上传和下载
阅读目录 一:上传文件(包括单个文件或多个文件上传) 二:下载文件 回到顶部 一:上传文件(包括单个文件或多个文件上传) 在之前一篇文章,我们了解到nodejs中的流的概念,也了解到了使用流的优点,具 ...
- 基于hprose-golang创建RPC微服务
Hprose(High Performance Remote Object Service Engine) 是一款先进的轻量级.跨语言.跨平台.无侵入式.高性能动态远程对象调用引擎库.它不仅简单易用, ...
- [原创实践]redhat linux 5.3搭建Nexus
1:下载安装JDK,配置好环境变量(JAVA_HOME等) 下载linux下64位的jdk-7u45-linux-x64.tar.gz(百度网盘下载,官网的jdk-7u51-linux-x64.tar ...
- eclipse Maven配置以及使用方法
简述: 现需要在Eclipse中配置Maven插件,同时安装maven应用,配置Maven环境变量,建立Maven管理的工程,并用Maven导入Gson包, 编写简易Json输出程序 步骤: 1. 首 ...
- Redis——基础使用
Redis总体介绍: Redis特性 Redis(REmote DIctionary Server),是一个开源的内存数据库 持久化:RDB.AOF 主备复制 丰富的数据结构 Lua脚本.事务 Red ...
- oracle常规使用(一)
目录 特殊sql distinct 项目中遇到表中无主键,但是某个字段不能重复. 需要匹配id串里的内容 批量更新,但是批量成功返回的是-1 时间格式化 行列互转 应用场景 列转行 总结 oracle ...