zoj 1083 Frame Stacking
其实就是一个拓补排序。(动态记录第i个之上的j存不存在,反过来就是第j个之下的i)
首先确立每个框的位置(题目明确说了每一边都不会被完全覆盖)。/*可以通过搜索,搜索到该框的所有四个角*/||如果题目要求在严格一点,这个题目难度几何增加,在一定范围内是可算顺序的。
检查边框的位置如果不是原来的字母,则说明原来的字母被现在的字母覆盖,得到一个局部大小关系(计算第j个下i的数量,0的话就确定下来这个j的位置了),接下来的就是拓补排序了。
值得一提的是如果有多种可能的话,要按字典顺序逐个输出。(隐含的就是在循环遍历,默认条件就是字典顺序)
#include<stdio.h> #include<string.h> int topo[][]; char map[][]; int xmax[],xmin[],ymax[],ymin[];/*每个字母框的四个角,即x的两个极值和y的两个极值*/ char result[];/*字母框掩盖的结果*/ int h,w; int exist[];/*创建一个可能的所有字母框,如果出现就记录它是否出现*/ int used[];/*已经确定的字母框*/ int sum; void solve(int step)/*所有出现的框 解决第几个框*/ { int s[]; int i,j; if(step==sum)/*如果解决的框到超出正常一个证明前面所有sum个框都确定了顺序*/ { for(i=;i<sum;i++)/*成功后输出结果*/ printf("%c",result[i]); printf("\n"); } else { memset(s,,sizeof(s));/*每次找到最底层的一个(除了已经确定下来的底层)*/ for(i=;i<;i++) if(exist[i]&&!used[i])/*找到存在并且没有确定下来的框*/ { for(j=;j<;j++) if(topo[j][i]==&&!used[j])/*找到所有在i下面的框*/ s[i]++;/*统计在i框下面的框的个数*/ } for(i=;i<;i++)/*按照字母顺序找满足条件的,那么最后就是有多个s=0,存储也是按字母顺序的*/ if(exist[i]&& !used[i]&& s[i]==)/*如果根据前面的寻找没有找到比i更低的框,那么就可以确定它就是第step*/ { result[step]=i+'A'; used[i]=; solve(step+); used[i]=; } } return; } int main() { int i,j; while(scanf("%d",&h)!=EOF) { scanf("%d",&w); for(i=;i<h;i++) scanf("%s",map[i]); memset(xmin,,sizeof(xmin)); memset(xmax,,sizeof(xmax)); memset(ymin,,sizeof(ymin)); memset(ymax,,sizeof(xmax)); memset(exist,,sizeof(exist)); sum=; for(i=;i<h;i++) for(j=;j<w;j++) if(map[i][j]!='.')/*该点有字母覆盖*/ { if(!exist[map[i][j]-'A'])/*如果该字母没用出现过*/ { exist[map[i][j]-'A']=;/*记录该字母是否出现*/ sum++;/*统计不同字母框的个数*/ } /*更新当前字母框的四个极值范围*/ if(j>xmax[map[i][j]-'A']) xmax[map[i][j]-'A'] = j; if(j<xmin[map[i][j]-'A']) xmin[map[i][j]-'A'] = j; if(i>ymax[map[i][j]-'A']) ymax[map[i][j]-'A'] = i; if(i<ymin[map[i][j]-'A']) ymin[map[i][j]-'A'] = i; } memset(topo,,sizeof(topo)); for(i=;i<;i++) if(exist[i])/*寻找出现过的字母框*/ { /*搜索每个字母框的四条边是否有其他框在他上面*/ for(j=xmin[i]; j<=xmax[i]; j++)/*从左下角搜索底边到右下角*/ if(map[ymin[i]][j] != i+'A') topo[i][map[ymin[i]][j]-'A'] = ;/*第i框有第j个框在他上面*/ for(j=xmin[i]; j<=xmax[i]; j++)/*从左上角搜索最高边到右上角*/ if(map[ymax[i]][j] != i+'A') topo[i][map[ymax[i]][j]-'A'] = ; for(j=ymin[i]; j<=ymax[i]; j++)/*从左下角搜索左边到左上角*/ if(map[j][xmin[i]] != i+'A') topo[i][map[j][xmin[i]]-'A'] = ; for(j=ymin[i]; j<=ymax[i]; j++)/*做右下角搜素右边到右上角*/ if(map[j][xmax[i]] != i+'A') topo[i][map[j][xmax[i]]-'A'] = ; } memset(used,,sizeof(used));/*初始如何框都没有确定*/ solve(); } return ; }
zoj 1083 Frame Stacking的更多相关文章
- Frame Stacking ZOJ 1083,poj 1128
Frame Stacking Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4034 Accepted: 1352 De ...
- Frame Stacking(拓扑排序)
题目链接:http://acm.tju.edu.cn/toj/showp1076.html1076. Frame Stacking Time Limit: 1.0 Seconds Memory ...
- POJ 1128 Frame Stacking(拓扑排序·打印字典序)
题意 给你一些矩形框堆叠后的鸟瞰图 推断这些矩形框的堆叠顺序 每一个矩形框满足每边都至少有一个点可见 输入保证至少有一个解 按字典序输出全部可行解 和上一题有点像 仅仅是这个要打印全部的可行 ...
- Frame Stacking 框架堆叠
/* [题目来源]http://poj.org/problem?id=1128 [题目分析] 几张图片叠在一起,给出堆叠后的情况,要求出所有可能的从下到上的堆叠顺序. [思路分析] 1.题目已经很明确 ...
- POJ1128 Frame Stacking(拓扑排序+dfs)题解
Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ ... ...
- POJ 1128 Frame Stacking (拓扑排序)
题目链接 Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ ...
- Frame Stacking 拓扑排序 图论
Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ .... ...
- Frame Stacking
poj1128:http://poj.org/problem?id=1128 题意:一个二维图里面有几个相框(四条边的空心矩形框).有重叠,求重叠顺序.还有题目保证至少存在一种符合要求的序列,当有多种 ...
- POJ1128 Frame Stacking(拓扑排序)
题目链接:http://poj.org/problem?id=1128 题意:给你一个平面,里面有些矩形(由字母围成),这些矩形互相有覆盖关系,请从求出最底层的矩形到最上层的矩形的序列,如果存在多种序 ...
随机推荐
- uvalive5818 uva12376 As Long as I Learn, I Live
题意:给出一个又向图每个图有权值和编号(正方形里的是编号),从第0号节点开始每次向当前节点所连的点中权值最大的节点移动(不会存在权值相同的节点),问最后所在的节点编号和经过的节点的权值之和. 解:模拟 ...
- 04737_C++程序设计_第9章_运算符重载及流类库
例9.1 完整实现str类的例子. #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> ...
- Ubuntu下屏幕录像、后期处理不完全攻略
提要 如果要做成果展示或者效果演示,通常需要录取屏幕生成视频文件,在windows中我们可以用屏幕录像专家在录像, vegas 来做后期处理,Ubuntu可以么? 答案时当然可以!虽然第一次用觉得有点 ...
- CXF 的IP拦截
非常久没有写技术文档了,今天 记录下Webserver的Ip限制吧 需求是:webserver接口能在内网訪问,可是測试平台的webserver要能够在外网訪问,这样就有了一点差别, 这个实现的比較简 ...
- This project references NuGet package(s) that are missing on this computer.
Install Nuget. Right click on the solution and select "Enable NuGet Package Restore". Clic ...
- android入门——UI(4)
GridView控件实现菜单 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xml ...
- Hibernate中为什么要重写equals方法和hashcode方法
1.*为什么要重写equals方法,首先我们来看一下equals源码: public boolean equals(Object anObject) { if (this == anObject) { ...
- VS2013 快捷键乱掉如何修改回来
比如 CTRL+E+C =注释 F6=重新生成解决方案 CTRL+D+Q=运行时快速监视 工具-->选项-->环境-->键盘-->应用以下其他键盘映射方案,下拉选择 Visua ...
- C++_基础_继承、多态
内容: (1)子类中的拷贝构造和拷贝赋值 (2)多继承和虚继承 (3)多态的初识 (4)虚析构的特性和使用 (5)多态的底层实现 (6)纯虚函数.抽象类的概念 1.子类中的拷贝构造和拷贝赋值 子类中的 ...
- PHP系列笔记——Zend_Controller工作流程
Zend_Controller_Front接收请求,然后调用Zend_Controller_Router_Rewrite来决定哪个控制器被派遣.为了在请求中设置控制器和动作名称,Zend_Contro ...