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 题意:给你一个平面,里面有些矩形(由字母围成),这些矩形互相有覆盖关系,请从求出最底层的矩形到最上层的矩形的序列,如果存在多种序 ...
随机推荐
- 武汉新芯:定位存储器制造,两年后或推3D NAND
武汉新芯集成电路制造公司(XMC)2006成立,2012年底起独立经营,是国有制企业.为了区别于本土的制造巨头SMIC(中芯国际)和华力微电子(HLMC)等,XMC将立足存储器制造.近日,武汉新芯董事 ...
- xcode UIButton创建、监听按钮点击、自定义按钮 、状态 、内边距
代码创建 //创建UIButton UIButton * btnType=[[UIButton alloc]init]; //设置UIControlStateNormal状态下的文字颜色 [btnTy ...
- java中两个对象间的属性值复制,比较,转为map方法实现
package com.franson.study.util; import java.lang.reflect.InvocationTargetException; import java.lang ...
- SQL server 2008无法连接Local服务器的解决办法
SQL的有些服务总是在关机的时候自动关闭,然后你可以打开 控制面板——管理工具——服务,然后找到SQL相关的服务,右键——属性,里面有设置,可以设成自动启动
- English - consist of 和 compose of 的区别
comprise,compose,consist,constitute,include 这一组动词都有"组成,包含"的意思. comprise v.包含,包括,由……组成(整体): ...
- Tomcat使用startup启动,一闪而过,如何查看出错信息
解决办法:打开startup.bat,通过使用run命令在原有启动窗口显示出错信息. 在startup.bat中找到:call "%EXECUTABLE%" start %CMD_ ...
- 注意:只有xcode5.1创建的项目会自动适配iphone6,iphone6p
注意:只有xcode5.1创建的项目会自动适配iphone6,iphone6p
- BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )
考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...
- Labview学习之程序Web发布
Labview学习之程序Web发布 1. LabVIEW Web服务器 在LabVIEW开发环境中,自身带了一个已连接好的Web服务器.LabVIEW Web服务器除了与其他Web服务器一样能 ...
- java 线程学习
转载:详见处http://lavasoft.blog.51cto.com/62575/27069 Java多线程编程总结 下面是Java线程系列博文的一个编目: Java线程:概念与原理 ...