zoukankan      html  css  js  c++  java
  • POJ 1128 Frame Stacking 拓扑排序+暴搜

    这道题输出特别坑。。。。

    题目的意思也不太好理解。。

    就解释一下输出吧。。
    它让你 从下往上输出。
    如果有多种情况,按照字典序从小往大输出。。。
    就是这个多种情况是怎么产生的呢。
    下面给一组样例。
    这里写图片描述
    很明显 A在最底下且A在Z下,Y和这个连通块 没有相交。
    答案是:
    AYZ
    AZY
    YAZ

    所以题目的意思是让你输出可能的方案。 并不管它是在第几层上。

    前几次WA的原因:没有考虑多种情况
    后几次WA的原因:把这个块分层以后按照层排好序以后next_permutation
    现在看看真是被我自己蠢哭了、、、

    最后附一个无解数据吧(把所有结果输出就会超时)
    (但是测试数据里没有这样的数据):
    15
    18
    AAABBBCCCDDDEEEFFF
    A.AB.BC.CD.DE.EF.F
    AAABBBCCCDDDEEEFFF
    GGGHHHIIIJJJKKKLLL
    G.GH.HI.IJ.JK.KL.L
    GGGHHHIIIJJJKKKLLL
    MMMNNNOOOPPPQQQRRR
    M.MN.NO.OP.PQ.QR.R
    MMMNNNOOOPPPQQQRRR
    SSSTTTUUUVVVWWWXXX
    S.ST.TU.UV.VW.WX.X
    SSSTTTUUUVVVWWWXXX
    YYYZZZ…………
    Y.YZ.Z…………
    YYYZZZ…………

    // by SiriusRen
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define mem(ARRAY,NUM) memset(ARRAY,NUM,sizeof(ARRAY))
    using namespace std;
    int n,m,tot,N;
    char a[30][30],s[30],lm[30],lx[30],rm[30],rx[30],in[30],v[999];
    int first[30],next[999];
    bool vis[30],map[30][30],VIS[30];
    void add(char x,char y){v[tot]=y;next[tot]=first[x];first[x]=tot++;}
    void dfs(int t){
        if(t==N+1){
            for(char i=1;i<=N;i++)printf("%c",s[i]+'A');putchar('
    ');
        }
        for(char i=0;i<26;i++)
            if(!in[i]&&vis[i]&&!VIS[i]){
                VIS[i]=1,s[t]=i;
                for(char j=first[i];~j;j=next[j])in[v[j]]--;
                dfs(t+1);
                for(char j=first[i];~j;j=next[j])in[v[j]]++;
                VIS[i]=0;
            }
    }
    int main(){
        while(~scanf("%d%d",&n,&m)){
            mem(lm,0x3f);mem(rm,0x3f);mem(first,-1);tot=N=0;
            mem(lx,0);mem(rx,0),mem(map,0);mem(vis,0);mem(in,0);
            for(char i=1;i<=n;i++)
                for(char j=0;j<=m;j++){
                    scanf("%c",&a[i][j]);
                    if(a[i][j]!='.'&&a[i][j]!='
    '){
                        a[i][j]-='A';
                        if(!vis[a[i][j]])vis[a[i][j]]=1,N++;
                        lm[a[i][j]]=min(lm[a[i][j]],j);
                        rm[a[i][j]]=min(rm[a[i][j]],i);
                        lx[a[i][j]]=max(lx[a[i][j]],j);
                        rx[a[i][j]]=max(rx[a[i][j]],i);
                    }
                }
            for(char i=0;i<26;i++)
                if(vis[i]){
                    for(char j=lm[i];j<=lx[i];j++){
                        if(a[rm[i]][j]!=i&&!map[a[rm[i]][j]][i])map[a[rm[i]][j]][i]=1;
                        if(a[rx[i]][j]!=i&&!map[a[rx[i]][j]][i])map[a[rx[i]][j]][i]=1;
                    }
                    for(char j=rm[i];j<=rx[i];j++){
                        if(a[j][lm[i]]!=i&&!map[a[j][lm[i]]][i])map[a[j][lm[i]]][i]=1;
                        if(a[j][lx[i]]!=i&&!map[a[j][lx[i]]][i])map[a[j][lx[i]]][i]=1;
                    }
                }
            for(char i=0;i<26;i++)
                for(char j=0;j<26;j++)
                    if(map[i][j])add(j,i),in[i]++;
            dfs(1);
        }
    }

    这里写图片描述

    成功WA了一屏,,,,,,

  • 相关阅读:
    C#中将全部代码一次性折叠
    C#中图片单击旋转事件
    块参照重命名
    补强圈设计
    c# winform 按名称取得控件
    获得某控件的父控件(容器)中的所有控件
    回车键当Tab键使用
    替换CAD中原有命令为开发人员自己开发的命令的方法
    窗体设置
    判断控件的tag是否为空的方法
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532380.html
Copyright © 2011-2022 走看看