题目网址 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. 【Android】error: Error retrieving parent for item: No resource found that matches the given name 'Theme.Sherlock.Light.NoActionBar'.

    问题: res 文件夹下的 values 下的 styles.xml <style name="Sherlock.Light.NoActionBar" parent=&quo ...

  2. Spring 核心技术(5)

    接上篇:Spring 核心技术(4) version 5.1.8.RELEASE 1.4.5 自动装配协作者 Spring 容器可以自动连接协作 bean 之间的关系.你可以让 Spring 通过检查 ...

  3. BrowserSync,自动刷新,解放F5,去掉更新提示

    BrowserSync虽然这个技术不算新,但是依然有用.略微介绍下 没有安装node,先安装node,这里不再做介绍 安装 npm install -g browser-sync  全局安装,方便在任 ...

  4. java并发笔记之四synchronized 锁的膨胀过程(锁的升级过程)深入剖析

    警告⚠️:本文耗时很长,先做好心理准备,建议PC端浏览器浏览效果更佳. 本篇我们讲通过大量实例代码及hotspot源码分析偏向锁(批量重偏向.批量撤销).轻量级锁.重量级锁及锁的膨胀过程(也就是锁的升 ...

  5. 有容云-PPT | 当微服务遇见容器

    编者注: 本文为10月29日有容云高级技术顾问龙淼在Docker Live时代线下系列-广州站中演讲的PPT,本次线下沙龙为有容云倾力打造Docker Live时代系列主题线下沙龙,每月一期畅聊容器技 ...

  6. 什么?小程序实时语音识别你还在痛苦的对接科大讯飞?百度Ai识别?

    前言 微信小程序,说不上大火,但是需求还是不少的.各大企业都想插一足 于是前端同学就有事情做了. 需求 我需要录音 我边说话边识别,我要同声传译,我要文字转语音,还要萝莉音 我:??? 正文 一开始, ...

  7. exe、dos、bat等静默运行,后台运行,不弹窗的解决办法

    exe中 #pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" ) 1. WinExec(LPCS ...

  8. 深入理解JVM虚拟机开篇:JVM介绍与知识脉络梳理

    微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔 ...

  9. python代码规范整理

    规范参考源: 1.pep8(python代码样式规范):中文文档      https://blog.csdn.net/ratsniper/article/details/78954852 2.pep ...

  10. maven学习(2)仓库和配置

    1:本地资源库.中央存储库.远程存储库 1.1   本地资源库 当你建立一个 Maven 的项目,Maven 会检查你的 pom.xml 文件,以确定哪些依赖需要下载.首先,Maven 将从本地资源库 ...