其实就是一个拓补排序。(动态记录第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的更多相关文章

  1. Frame Stacking ZOJ 1083,poj 1128

    Frame Stacking Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4034   Accepted: 1352 De ...

  2. Frame Stacking(拓扑排序)

    题目链接:http://acm.tju.edu.cn/toj/showp1076.html1076.   Frame Stacking Time Limit: 1.0 Seconds   Memory ...

  3. POJ 1128 Frame Stacking(拓扑排序&#183;打印字典序)

    题意  给你一些矩形框堆叠后的鸟瞰图  推断这些矩形框的堆叠顺序  每一个矩形框满足每边都至少有一个点可见  输入保证至少有一个解 按字典序输出全部可行解 和上一题有点像  仅仅是这个要打印全部的可行 ...

  4. Frame Stacking 框架堆叠

    /* [题目来源]http://poj.org/problem?id=1128 [题目分析] 几张图片叠在一起,给出堆叠后的情况,要求出所有可能的从下到上的堆叠顺序. [思路分析] 1.题目已经很明确 ...

  5. POJ1128 Frame Stacking(拓扑排序+dfs)题解

    Description Consider the following 5 picture frames placed on an 9 x 8 array.  ........ ........ ... ...

  6. POJ 1128 Frame Stacking (拓扑排序)

    题目链接 Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ ...

  7. Frame Stacking 拓扑排序 图论

    Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ .... ...

  8. Frame Stacking

    poj1128:http://poj.org/problem?id=1128 题意:一个二维图里面有几个相框(四条边的空心矩形框).有重叠,求重叠顺序.还有题目保证至少存在一种符合要求的序列,当有多种 ...

  9. POJ1128 Frame Stacking(拓扑排序)

    题目链接:http://poj.org/problem?id=1128 题意:给你一个平面,里面有些矩形(由字母围成),这些矩形互相有覆盖关系,请从求出最底层的矩形到最上层的矩形的序列,如果存在多种序 ...

随机推荐

  1. C#的线程池的那些事

    最近在做站时发现,线程池的问题很棘手,所以总结了一篇关于线程池的文章,原文地址:http://www.shuonar.com/blog/ac16496b-87ec-4790-a9ea-d69bbffa ...

  2. Android 屏幕适配方式

    适配:即当前应用在相同的手机上面显示相同的效果.适配前需要首先确定当前手机所属像素密度类型(如:xhdpi.hdpi.mdpi等) 像素密度:每英寸上分布的像素点个数,单位(dpi,ppi),利用勾股 ...

  3. java把函数作为参数传递

    public class Tool { public void a()// /方法a { System.out.print("tool.a()..."); } public voi ...

  4. C++ *max_element函数找最大元素 *min_element函数找最小元素 STL算法(转)

    http://blog.sina.com.cn/s/blog_6f3a860501019z1f.html #include<iostream> #include<algorithm& ...

  5. 关于c语言中负数位移位操作的漫谈

    近期有个朋友在程序中使用了对16进制数做负数移位(编译器是gcc),本人最次产生好奇.所以研究了一些. 对一个数做负数位移位的操作是不规范的,可是是可行的. 详细样例: char tmp = 0x10 ...

  6. javascript中数组排序

    在javascript中Array类中提供了一个可以为数组排序的方法Array.sort(): 但此方法排序方式是按照unicode码进行的排序,若将整数型加入到数组元素中, 排出的结果往往达不到我们 ...

  7. 【译】html5游戏入门

    [译]html5游戏入门 原文链接 简介 如果你想用canvas做个游戏,那么来对地方了. 但是但是你至少知道javascript怎么拼写(╯‵□′)╯︵┻━┻ 既然没问题,那先来玩一下或者下载 创建 ...

  8. Android App开发常用专题开源代码

    Android App开发中用到过的专题类开源代码: 项目的需求多了,不知不觉成了Github摘抄员,感谢分享精神,节省了很多弯路和时间.不过想要实现指定效果,还是要看懂作者的思路才好下手改造. 主题 ...

  9. 创建一个支持异步操作的operation

    NSOperationQueue时iOS中常用的任务调度机制.在创建一个复杂任务的时候,我们通常都需要编写NSOperation的子类.在大部分情况下,重写main方法就可以满足要求.main方法执行 ...

  10. JDK源码学习--String篇(-)

    工作三年了,用了三年的JAVA,突然发现竟然没有好好的看下JDK的源码,整天用着的String,只是大概知道怎么回事,其中的实现逻辑却是一头雾水. 知耻而后勇,加油!!! java.lang.Stri ...