poj1128拓扑排序

  按照硕神的说法,以无比丑的姿势 建了个图。然后裸搞 拓扑排序

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
#include<math.h>
using namespace std;
struct Node
{
    int l;int r;int up;int down;
}node[1111111];
int sum;
const int INF=0xfffffff;
int Map[100][100];
int out[100];
int in[100];
int path[1000];
int vis[1000];
int vis1[1111];
void dfs(int cnt)
{
    if(cnt==sum){
        for(int i =0 ;i< sum;i++)
            printf("%c",path[i]+‘A‘);
        cout<<endl;
        return ;
    }
    for(int i =0 ;i<26;i++){
        if(vis[i]&&out[i]==0&&!vis1[i]){
            vis1[i]=1;
            path[cnt]=i;
            for(int j=0;j<26;j++){
                if(Map[j][i]) out[j]--;
            }
            dfs(cnt+1);
            for(int j=0;j<26;j++){
                if(Map[j][i]) out[j]++;
            }
            vis1[i]=0;
        }
    }

}
int main()
{
    int n,m;
    char str[100][1111];
    while( cin>>n>>m){
    sum=0;
    memset(Map,0,sizeof(Map));
    memset(out,0,sizeof(out));
    memset(in, 0,sizeof(in));
    memset(vis,0,sizeof(vis));
    memset(vis1,0,sizeof(vis1));
    for(int i = 0 ;i< 100;i++){
        node[i].down=INF;node[i].up=0;node[i].r=0;node[i].l=INF;
    }
    for(int i =0 ;i<n;i++)
        scanf("%s",str[i]);
    for(int i =0 ;i<n;i++){
        for(int j=0;j<m;j++){
            if(str[i][j]>‘Z‘||str[i][j]<‘A‘)continue;
            int t=str[i][j]-‘A‘;
            if(i<node[t].down) node[t].down = i;
            if(i>node[t].up) node[t].up=i;
            if(j>node[t].r) node[t].r= j;
            if(j<node[t].l) node[t].l=j;
            vis[t]=1;
        }
    }
    for(int i= 0;i<26;i++)
        if(vis[i]) sum++;
    for(int t=0;t<26;t++){
        if(!vis[t]) continue;
        int l=node[t].l;int r=node[t].r;int up=node[t].up;int down = node[t].down;
        int i = down;
        for(int j = l;j<=r;j++){
            if(str[i][j]>‘Z‘||str[i][j]<‘A‘)continue;
            int cc=str[i][j]-‘A‘;
            if(cc!=t&&!Map[cc][t]) {
                Map[cc][t]= 1;
                out[cc]++;
            }
        }
        i=up;
        for(int j =l;j<=r;j++){
            if(str[i][j]>‘Z‘||str[i][j]<‘A‘)continue;
            int cc=str[i][j]-‘A‘;
            if(cc!=t&&!Map[cc][t]) {
                Map[cc][t]= 1;
                out[cc]++;
            }
        }
        int j= l;
        for(int i = down+1;i<up;i++){
            if(str[i][j]>‘Z‘||str[i][j]<‘A‘)continue;
            int cc=str[i][j]-‘A‘;
            if(cc!=t&&!Map[cc][t]) {
                Map[cc][t]= 1;
                out[cc]++;
            }
        }
        j= r;
        for(int i = down+1;i<up;i++){
            if(str[i ][j]>‘Z‘||str[i][j]<‘A‘)continue;
            int cc=str[i][j]-‘A‘;
            if(cc!=t&&!Map[cc][t]) {
                Map[cc][t]= 1;
                out[cc]++;
            }
        }
    }
    dfs(0);
    }
    return 0;
}

poj1128拓扑排序

时间: 2024-10-14 00:34:44

poj1128拓扑排序的相关文章

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

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

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

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-DAG拓扑排序

题目链接POJ1128 思路 如果在A的边框上出现了字母B,就说明B在A的上方 如果边框A在边框B的下方,就添加从A到B的一条有向边(题目要求从下到上输出) 那么所求的是所得有向无环图的拓扑排序 题目还要求按照字典序输出所有可能的顺序,用深度优先搜索 附代码 #include <cstdio> #include <cstring> #include <vector> #include <cmath> #include <iostream> #in

拓扑排序进阶

poj2585 poj1128 图论部分的问题,重要的是建图.这两个题目比较类似. poj2585,通过建图,直接进行topsort,建图过程是:标定每一部分应有的标号,比较实际的标号,进行加边,数据量小,可采用矩阵存储.通过拓扑排序,判断是否存在环,如果存在环则BROKEN ,否则就CLEAN; poj1128,这个建图比上一个麻烦,通过搜索标记每一个边框的lt(左上角的坐标)和右下角的坐标rb,进行建图,回溯的dfs过程比较难写,需要字典序输出. 版权声明:本文为博主原创文章,未经博主允许不

拓扑排序讲解

在这里我们要说的拓扑排序是有前提的 我们在这里说的拓扑排序是基于有向无环图的!!!. (⊙o⊙)…我所说的有向无环图都知道是什么东西吧.. 如果不知道,我们下面先来来说说什么是有向无环图. 所谓有向无环图,顾名思义是不存在环的有向图(至于有向图是什么不知道的在前面我们有一个图论讲解上都有). 点的入度:以这个点为结束点的边数. 点的出度:以这个点为出发点的边的条数. 拓扑序就是对于一个节点的一个排列,使得(u,v)属于E,那么u一定出现在v的前面.然而拓扑排序就是一个用来求拓扑序的东西. 对于左

CSU 1804: 有向无环图(拓扑排序)

http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 题意:…… 思路:对于某条路径,在遍历到某个点的时候,之前遍历过的点都可以到达它,因此在这个时候对答案的贡献就是∑(a1 + a2 + a3 + ... + ai) * bv,其中a是之前遍历到的点,v是当前遍历的点. 这样想之后就很简单了.类似于前缀和,每次遍历到一个v点,就把a[u]加给a[v],然后像平时的拓扑排序做就行了. 1 #include <bits/stdc++.h>

7-9-有向图无环拓扑排序-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第7章  图 - 有向无环图拓扑排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceStack.c.ALGraph.c    

hihoCoder 1175:拓扑排序二

题目链接: http://hihocoder.com/problemset/problem/1175 题目难度:一星级(简单题) 今天闲来无事,决定刷一道水题.结果发现这道水题居然把我卡了将近一个钟头. 最后终于调通了.总结起来,原因只有一个:不够仔细. 思路不用细说了,就是拓扑排序的简单应用.然而,一些不起眼的细节才是让你掉坑里的真正原因. 猜猜哪儿可能出bug? // A simple problem, but you can't be too careful with it. #inclu