其实就是一个拓补排序。(动态记录第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. uvalive5818 uva12376 As Long as I Learn, I Live

    题意:给出一个又向图每个图有权值和编号(正方形里的是编号),从第0号节点开始每次向当前节点所连的点中权值最大的节点移动(不会存在权值相同的节点),问最后所在的节点编号和经过的节点的权值之和. 解:模拟 ...

  2. 04737_C++程序设计_第9章_运算符重载及流类库

    例9.1 完整实现str类的例子. #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> ...

  3. Ubuntu下屏幕录像、后期处理不完全攻略

    提要 如果要做成果展示或者效果演示,通常需要录取屏幕生成视频文件,在windows中我们可以用屏幕录像专家在录像, vegas 来做后期处理,Ubuntu可以么? 答案时当然可以!虽然第一次用觉得有点 ...

  4. CXF 的IP拦截

    非常久没有写技术文档了,今天 记录下Webserver的Ip限制吧 需求是:webserver接口能在内网訪问,可是測试平台的webserver要能够在外网訪问,这样就有了一点差别, 这个实现的比較简 ...

  5. 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 ...

  6. android入门——UI(4)

    GridView控件实现菜单 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xml ...

  7. Hibernate中为什么要重写equals方法和hashcode方法

    1.*为什么要重写equals方法,首先我们来看一下equals源码: public boolean equals(Object anObject) { if (this == anObject) { ...

  8. VS2013 快捷键乱掉如何修改回来

    比如 CTRL+E+C =注释 F6=重新生成解决方案 CTRL+D+Q=运行时快速监视 工具-->选项-->环境-->键盘-->应用以下其他键盘映射方案,下拉选择 Visua ...

  9. C++_基础_继承、多态

    内容: (1)子类中的拷贝构造和拷贝赋值 (2)多继承和虚继承 (3)多态的初识 (4)虚析构的特性和使用 (5)多态的底层实现 (6)纯虚函数.抽象类的概念 1.子类中的拷贝构造和拷贝赋值 子类中的 ...

  10. PHP系列笔记——Zend_Controller工作流程

    Zend_Controller_Front接收请求,然后调用Zend_Controller_Router_Rewrite来决定哪个控制器被派遣.为了在请求中设置控制器和动作名称,Zend_Contro ...