USACO Frame Up 矩阵覆盖 拓扑排序

  矩阵覆盖的题, 可以转化为拓扑排序。写这个拓扑排序废了好大的劲以后好好看看。代码如下:

/*
    ID: m1500293
    LANG: C++
    PROG: frameup
*/

#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;
int h, w;
int x1[30], y1[30], x2[30], y2[30];
int ex[30];     //有没有出现
char Map[55][55];
int indeg[30];
int d[30][30];

int ans[30], nans;

void dfs()       //很精髓的拓扑排序
{
    bool flog = 0;
    for(int i=1; i<=26; i++) if(ex[i])
    {
        flog = 1;
        break;
    }
    if(!flog)
    {
        for(int i=0; i<nans; i++) printf("%c", ans[i]+‘@‘);
        printf("\n");
        return ;
    }
    for(int u=1; u<=26; u++) if(ex[u] && !indeg[u])
    {
        ex[u] = 0;
        ans[nans++] = u;
        for(int v=1; v<=26; v++) if(d[u][v]) indeg[v]--;
        dfs();
        ex[u] = 1;
        nans--;
        for(int v=1; v<=26; v++) if(d[u][v]) indeg[v]++;
    }
}

int main()
{
    freopen("frameup.in", "r", stdin);
    freopen("frameup.out", "w", stdout);
    scanf("%d%d", &h, &w);
    for(int i=1; i<=h; i++)
    {
        scanf("%s", Map[i]+1);
        for(int j=1; j<=w; j++)
        {
            if(Map[i][j] == ‘.‘) continue;
            int id = Map[i][j] - ‘@‘;
            if(!x1[id] || x1[id]>i) x1[id] = i;
            if(!y1[id] || y1[id]>j) y1[id] = j;
            if(!x2[id] || x2[id]<i) x2[id] = i;
            if(!y2[id] || y2[id]<j) y2[id] = j;
            ex[id] = 1;
        }
    }
    for(int u=1; u<=26; u++) if(ex[u])
    {
        //横着扫 x1[u] x2[u] y1[u] -> y2[u]
        for(int y=y1[u]; y<=y2[u]; y++)
        {
            int id = Map[x1[u]][y] - ‘@‘;
            if(id != u && !d[u][id]) d[u][id] = 1, indeg[id]++;
            id = Map[x2[u]][y] - ‘@‘;
            if(id != u && !d[u][id]) d[u][id] = 1, indeg[id]++;
        }
        for(int x=x1[u]; x<=x2[u]; x++)
        {
            int id = Map[x][y1[u]] - ‘@‘;
            if(id != u && !d[u][id]) d[u][id] = 1, indeg[id]++;
            id = Map[x][y2[u]] - ‘@‘;
            if(id != u && !d[u][id]) d[u][id] = 1, indeg[id]++;
        }
    }
    nans = 0;
    dfs();
    return 0;
}
时间: 2024-12-26 20:29:20

USACO Frame Up 矩阵覆盖 拓扑排序的相关文章

Frame Stacking(拓扑排序)

题目链接:http://acm.tju.edu.cn/toj/showp1076.html1076.   Frame Stacking Time Limit: 1.0 Seconds   Memory Limit: 65536K Total Runs: 145   Accepted Runs: 54 Consider the following 5 picture frames placed on an 9 x 8 array. Now place them on top of one anot

POJ1128 Frame Stacking(拓扑排序)经典

Frame Stacking Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4454   Accepted: 1509 Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ ........ ........ .CCC.... EEEEEE.. ........ ........ ..

POJ1128 Frame Stacking 【拓扑排序】+【深搜】

Frame Stacking Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4074   Accepted: 1371 Description Consider the following 5 picture frames placed on an 9 x 8 array. ........ ........ ........ ........ .CCC.... EEEEEE.. ........ ........ ..

POJ 1128 &amp; ZOJ 1083 Frame Stacking (拓扑排序)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=83 http://poj.org/problem?id=1128 Frame Stacking Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4102   Accepted: 1378 Description Consider the following 5 picture frames placed

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

题意  给你一些矩形框堆叠后的鸟瞰图  推断这些矩形框的堆叠顺序  每一个矩形框满足每边都至少有一个点可见  输入保证至少有一个解 按字典序输出全部可行解 和上一题有点像  仅仅是这个要打印全部的可行方案  建图还是类似  由于每一个矩形框的四边都有点可见  所以每一个矩形框的左上角和右下角的坐标是能够确定的  然后一个矩形框上有其他字符时  就让这个矩形框相应的字符和那个其他字符建立一个小于关系  由于要打印方案  所以在有多个入度为0的点时须要用DFS对每种选择都进行一遍拓扑排序 #incl

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

题意  给你一些矩形框堆叠后的俯视图  判断这些矩形框的堆叠顺序  每个矩形框满足每边都至少有一个点可见  输入保证至少有一个解 按字典序输出所有可行解 和上一题有点像  只是这个要打印所有的可行方案  建图还是类似  因为每个矩形框的四边都有点可见  所以每个矩形框的左上角和右下角的坐标是可以确定的  然后一个矩形框上有其它字符时  就让这个矩形框对应的字符和那个其它字符建立一个小于关系  由于要打印方案  所以在有多个入度为0的点时需要用DFS对每种选择都进行一遍拓扑排序 #include

POJ 2585 Window Pains(拓扑排序&#183;窗口覆盖)

题意  有一个4*4的显示器  有9个程序  每个程序占2*2个格子  他们的位置如图所示  当你运行某个程序时  这个程序就会显示在顶层覆盖其它的程序  给你某个时刻显示器的截图  判断此时电脑是否死机了(出现了不合法的覆盖关系) 拓扑排序的应用  关键是建图  当一个程序A的区域上有其它程序B时  说明A是在B之前运行的  那么我们可以建立一个A<B的拓扑关系  最后判断是否有环就行了  个人认为下标换为0操作起来比较方便  所以都还为了0 #include <cstdio> #in

ACM/ICPC 之 拓扑排序+DFS(POJ1128(ZOJ1083))

经典的拓扑排序问题,难点在于字典序输出和建立拓扑图,另外理解题意是最难的难点,没有之一... POJ1128(ZOJ1083)-Frame Stacking 题意:每个图片由同一字母组成的边框表示,每个图片的字母都不同: 在一个最多30*30的区域放置这些图片,问底层向顶层叠加的图片次序,多选时按字典序输出 注:每个图片的四边都会有字符显示,其中顶点显示两边. 题解:题意的理解是难点,题目对图片的范围确定说得有点含糊不清,博主一开始就被出现的五张图片的样例迷惑,理解重心放错了.题目最需要理解的是

POJ1420 Spreadsheet(拓扑排序)注意的是超内存

Spreadsheet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 617   Accepted: 290 Description In 1979, Dan Bricklin and Bob Frankston wrote VisiCalc, the first spreadsheet application. It became a huge success and, at that time, was the ki