题目网址 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的更多相关文章

  1. POJ1128 Frame Stacking(拓扑排序+dfs)题解

    Description Consider the following 5 picture frames placed on an 9 x 8 array.  ........ ........ ... ...

  2. POJ1128 Frame Stacking(拓扑排序)

    题目链接:http://poj.org/problem?id=1128 题意:给你一个平面,里面有些矩形(由字母围成),这些矩形互相有覆盖关系,请从求出最底层的矩形到最上层的矩形的序列,如果存在多种序 ...

  3. 图论之拓扑排序 poj 2367 Genealogical tree

    题目链接 http://poj.org/problem?id=2367 题意就是给定一系列关系,按这些关系拓扑排序. #include<cstdio> #include<cstrin ...

  4. UVA - 1572 Self-Assembly(图论模型+拓扑排序)

    题意:判断利用给出的正方形是否能拼接出无限延伸的结构. 分析:正方形上的字母看做点,正方形看做有向边. 例如: 若上下两个正方形能拼接,需要B+~C+是个有向边. 对输入的处理是:把A+,A-分别映射 ...

  5. tsort - 拓扑排序

    tsort - 拓扑排序 本文链接:http://codingstandards.iteye.com/blog/834572   (转载请注明出处) 用途说明 tsort命令通常用于解决一种逻辑问题, ...

  6. Frame Stacking(拓扑排序)

    题目链接:http://acm.tju.edu.cn/toj/showp1076.html1076.   Frame Stacking Time Limit: 1.0 Seconds   Memory ...

  7. POJ 1128 Frame Stacking(拓扑排序&#183;打印字典序)

    题意  给你一些矩形框堆叠后的鸟瞰图  推断这些矩形框的堆叠顺序  每一个矩形框满足每边都至少有一个点可见  输入保证至少有一个解 按字典序输出全部可行解 和上一题有点像  仅仅是这个要打印全部的可行 ...

  8. POJ 1128 Frame Stacking (拓扑排序)

    题目链接 Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ ...

  9. ACM/ICPC 之 拓扑排序+DFS(POJ1128(ZOJ1083)-POJ1270)

    两道经典的同类型拓扑排序+DFS问题,第二题较第一题简单,其中的难点在于字典序输出+建立单向无环图,另外理解题意是最难的难点,没有之一... POJ1128(ZOJ1083)-Frame Stacki ...

随机推荐

  1. ansible-yum

    #yum 需要在vim /etc/ansible/hosts里面给执行的主机配置 远程调用python的路径不知道为什么默认值认识python2.6.6 vim /etc/ansible/hosts ...

  2. kubernetes对接第三方认证

    kubernetes对接第三方认证 kubernetes离线安装包地址 概述 本文介绍如何使用github账户去关联自己kubernetes账户.达到如下效果: 使用github用户email作为ku ...

  3. HashMap常见面试题整理

    花了三天时间来仔细阅读hashMap的源码,期间补了下不少数据结构的知识,刷了不少相关的面试题并进行了整理 1.谈一下HashMap的特性? 1.HashMap存储键值对实现快速存取,允许为null. ...

  4. 爬虫获取搜狐汽车的配置信息 和swf动态图表的销量数据-------详细教学

    前情提要:需要爬取搜狐汽车的所有配置信息,具体配置对应的参数. 以及在动态图表上的历史销量. 比如: 一汽奥迪旗下Q5L 的<40 TFSI 荣享进取型 国VI >的历史销量和该配置的参数 ...

  5. koa2基于stream(流)进行文件上传和下载

    阅读目录 一:上传文件(包括单个文件或多个文件上传) 二:下载文件 回到顶部 一:上传文件(包括单个文件或多个文件上传) 在之前一篇文章,我们了解到nodejs中的流的概念,也了解到了使用流的优点,具 ...

  6. 基于hprose-golang创建RPC微服务

    Hprose(High Performance Remote Object Service Engine) 是一款先进的轻量级.跨语言.跨平台.无侵入式.高性能动态远程对象调用引擎库.它不仅简单易用, ...

  7. [原创实践]redhat linux 5.3搭建Nexus

    1:下载安装JDK,配置好环境变量(JAVA_HOME等) 下载linux下64位的jdk-7u45-linux-x64.tar.gz(百度网盘下载,官网的jdk-7u51-linux-x64.tar ...

  8. eclipse Maven配置以及使用方法

    简述: 现需要在Eclipse中配置Maven插件,同时安装maven应用,配置Maven环境变量,建立Maven管理的工程,并用Maven导入Gson包, 编写简易Json输出程序 步骤: 1. 首 ...

  9. Redis——基础使用

    Redis总体介绍: Redis特性 Redis(REmote DIctionary Server),是一个开源的内存数据库 持久化:RDB.AOF 主备复制 丰富的数据结构 Lua脚本.事务 Red ...

  10. oracle常规使用(一)

    目录 特殊sql distinct 项目中遇到表中无主键,但是某个字段不能重复. 需要匹配id串里的内容 批量更新,但是批量成功返回的是-1 时间格式化 行列互转 应用场景 列转行 总结 oracle ...