图论之拓扑排序 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 ...
随机推荐
- 【Android】Android sdk content loader 0%
前天用 Eclipse 突然遇到了这个问题...重启了好几次都不行,百度了一下,原来之前有不少人遇到过.后来找到了一篇文章,其中的方法二(如下): 方法二(关闭后,拔网线再重启): 如果用最省事的方法 ...
- sentos中bonding(网卡绑定技术)1
一.GRUB添加kernel参数 1.# vim /etc/sysconfig/grubGRUB_CMDLINE_LINUX="...... net.ifnames=0" ...
- hadoop大数据平台安全基础知识入门
概述 以 Hortonworks Data Platform (HDP) 平台为例 ,hadoop大数据平台的安全机制包括以下两个方面: 身份认证 即核实一个使用者的真实身份,一个使用者来使用大数据引 ...
- hive分桶表bucketed table分桶字段选择与个数确定
为什么分桶 (1)获得更高的查询处理效率.桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构.具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map ...
- 先定一个小目标:10天自学C语言编程,教你如何改变一生
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- axios异步提交表单数据的不同形式
踩坑Axios提交form表单几种格式 前后端分离的开发前后端, 前端使用的vue,后端的安全模块使用的SpringSecurity,使用postman测试后端的权限接口时发现都正常,但是使用vue+ ...
- Python递归函数,二分查找算法
目录 一.初始递归 二.递归示例讲解 二分查找算法 一.初始递归 递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但 ...
- Kafka集群配置---Windows版
Kafka是一种高吞吐量的分布式发布订阅的消息队列系统,Kafka对消息进行保存时是通过tipic进行分组的.今天我们仅实现Kafka集群的配置.理论的抽空在聊 前言 最近研究kafka,发现网上很多 ...
- Spring入门(六):条件化的bean
1. 概念 默认情况下,Spring中定义的bean在应用程序启动时会全部装配,不管当前运行的是哪个环境(Dev,QA或者Prod),也不管当前运行的是什么系统(Windows或者Linux),但有些 ...
- Markdown转载
@TOC 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页.如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown ...