图论之拓扑排序 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 ...
随机推荐
- QTableView表格控件区域选择-自绘选择区域
目录 一.开心一刻 二.概述 三.效果展示 四.实现思路 1.绘制区域 2.绘制边框 3.绘制 五.相关文章 原文链接:QTableView表格控件区域选择-自绘选择区域 一.开心一刻 陪完客户回到家 ...
- webpack4核心模块tapable源码解析
_ 阅读目录 一:理解Sync类型的钩子 1. SyncHook.js 2. SyncBailHook.js 3. SyncWaterfallHook.js 4. SyncLoopHook.js 二: ...
- opencv图像直方图均衡化及其原理
直方图均衡化是什么有什么用 先说什么是直方图均衡化,通俗的说,以灰度图为例,原图的某一个像素为x,经过某个函数变为y.形成新的图.新的图的灰度值的分布是均匀的,这个过程就叫直方图均衡化. 图像直方图均 ...
- 关于stm32f1使用ST官方DSP库中的FFT方法
先分享一下ST官方基于F1的DSP固件库,自从ST推出F4系列的DSP固件库之后,网上好像很难找到原来F1系列的DSP固件库了. 链接:https://pan.baidu.com/s/1S5h2Ti3 ...
- MySQL-EXPLAIN执行计划字段解释
做 MySQL 查询优化遇到明明建了索引查询仍然很慢,看这个 SQL 的执行计划,看它到底有没有用到索引,执行的具体情况.我们可以用 EXPLAIN 命令查看 SQL 的执行计划,SQL 优化的重要性 ...
- WPF中TimeSpan的坑
记一次在WPF中,在将格式为“DD.HH:mm:ss”字符串转换成TimeSpan时遇到的坑 如果字符串为:DD.HH:mm:ss,转换结果正确.例如: var currentValue = &quo ...
- postman-使用教程
postman postman是一款非常方便的API测试工具,可以帮我们快速的发起HTTP请求,下面记录一下postman的基本使用. postman安装 postman下载地址 下载安装打开之后就是 ...
- CheckListBox怎样得到多选值?
一般认为:foreach (object obj in checkedListBox1.SelectedItems)即可遍历选中的值.其实这里遍历的只是高亮的值并不是打勾的值.遍历打勾的值要用下面的代 ...
- PCA(主成分分析)原理,步骤详解以及应用
主成分分析(PCA, Principal Component Analysis) 一个非监督的机器学习算法 主要用于数据的降维处理 通过降维,可以发现更便于人类理解的特征 其他应用:数据可视化,去噪等 ...
- RedHat 6.5换源
https://wenku.baidu.com/view/5b87fb42c77da26924c5b03b.html