• POJ 1128 拓扑排序 + 深搜


    /* (⊙v⊙)嗯 貌似是一个建图 拓扑+深搜的过程。至于为什么要深搜嘛。。一个月前敲得题现在全部推了重敲,于是明白了。因为题意要求如果有多个可能的解的话。
     * 就要输出字典序最小的那个。所以可以对26个英文字母从小到大尝试能否排出结果。于是出现了 深搜回溯。先选定入度为0的边框。标记为已用。将所有与它连通的
     * 边框入度减一。然后递归搜索下一个。此时开始回溯。当前边框标记为未用,所有与它连通的边框入度加1.
     * 建图的过程则是。对每一个字母的边框测量出来。然后对A里的其它字母B。(B 覆盖 A)。有关系 map[A][B] = *1。in[B]++;
     */

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    #define maxn 27

    int map[maxn+5][maxn+5];    //建的图
    char m[35][35];     //输入
    int h, w;     // 输入size
    int tot;  //有多少种字母边框
    int in[maxn];  //每种字母对应的入度。
    char ans[maxn];   // 存储答案
    bool flag;

    struct Node   // 存储每个字母对应的边框边界
    {
        int lo, hi;
        int le, ri;
    }node[maxn+5];

    void buildmap()
    {
        for (int i=0; i<h; ++i)  // 测量边界
        {
            for (int j=0; j<w; ++j)
            {
                if (m[i][j] == '.')
                    continue;
                int temp = m[i][j] - 'A';
                if (in[temp] == -1)
                {
                    in[temp] = 0;
                    tot++;
                }
                if (i > node[temp].hi) node[temp].hi = i;
                if (i < node[temp].lo) node[temp].lo = i;
                if (j < node[temp].le) node[temp].le = j;
                if (j > node[temp].ri) node[temp].ri = j;
            }
        }

        for (int k=0; k<maxn; ++k)   //建图
        {
            if (in[k] == -1)
                continue;
            for (int i=node[k].lo; i<=node[k].hi; ++i)
            {
                for (int j=node[k].le; j<=node[k].ri; ++j)
                {
                    if (i>node[k].lo && i<node[k].hi && j>node[k].le && j<node[k].ri)
                        continue;
                    int temp = m[i][j] - 'A';
                    if (k != temp && !map[k][temp])
                    {
                       map[k][temp] = 1;
                       in[temp] += 1;
                    }
                }
            }
        }
    }
    int hh = 0;

    void dfs(int num)
    {
        if (num == tot)
        {
            ans[num] = '';
            cout << ans << endl;
            return;
        }

    //觉得应该会有字典序不同的答案。所以在输出加上判断。然而。wa了。应该是递归没有理解清楚。
    //    if (num == tot && flag)
    //    {
    //        ans[num] = '';
    //        puts(ans);
    //        flag = false;
    //        return;
    //    }

        for (int i=0; i<maxn; ++i)
        {
            if (in[i] == 0)
            {
                ans[num] = i + 'A';
                in[i] = -1;
                for (int j=0; j<maxn; j++)
                {
                   if (map[i][j])
                     in[j] -= 1;
                }
                dfs(num+1);
                in[i] = 0;
                for (int j=0; j<maxn; ++j)
                {
                   if (map[i][j])
                     in[j] += 1;
                }
            }
        }
        return;
    }

    int main()
    {
        while (scanf("%d%d", &h, &w) == 2)
        {
            tot = 0;
            memset(in, -1, sizeof(in));
            memset(map, 0, sizeof(map));
            flag = true;
            for (int i=0; i<maxn+5; ++i)
            {
                node[i].lo = 100;
                node[i].le = 100;
                node[i].hi = -1;
                node[i].ri = -1;
            }
            for (int i=0; i<h; ++i)
            {
                scanf("%s", m[i]);
            }
            buildmap();
            dfs(0);
        }
        return 0;
    }

  • 相关阅读:
    开发错误记录2 .MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
    开发错误记录1:解决:Only the original thread that created a view hierarchy can touch its views.
    第二篇 Python初识别及变量名定义规范
    第三篇 Python执行方式和变量初始
    第一篇 Python安装与环境变量的配置
    1. Linux系统常用操作
    Python的内存管理、命名规则、3个特性讲解
    操作系统及Python解释器工作原理讲解
    计算机基础小白篇
    Oracle SQL性能优化
  • 原文地址:https://www.cnblogs.com/icode-girl/p/4599845.html
Copyright © 2020-2023  润新知