/*
【题目来源】http://poj.org/problem?id=1128【题目分析】
几张图片叠在一起,给出堆叠后的情况,要求出所有可能的从下到上的堆叠顺序。【思路分析】
1.题目已经很明确的告诉每个边框的每条边,至少会有一个字母露在外面
所以遍历整张图,确定每个边框的范围。 只需确定左上角和右下角即可。
2.根据每个边框的范围再遍历,若应该出现A的位置出现了B,那么B一定在A上面。这样各个边框的上下顺序就求出来。
若B在A上面,那么记录A->B。
3.拓扑排序
4.要求输出所有能情况且按字母顺序输出。那么只要按照字母顺序使用DFS(递归)来解决,注意处理完入度为0的点(删边更新入度)
递归进去后要还原回来(删去的边弄回来,入度更新回来)。从而保证可以下次使用 【小小心得】
参考了网上代码;拓扑排序的递归用法
*/
#include <iostream>
#include <cstring>
#include <iterator>
#include <vector>
#include <cstdio>
using namespace std;struct Frame
{int x1, y1;//左上角 int x2, y2;//右下角 //左上角必须初始化大一点,右下角必须初始化小一点 Frame(){x1 = y1 = 100;x2 = y2 = -100;}
};//记录26个字母使用了哪些
bool used[26];//入度
int into[26];//存储拓扑排序的图
int map[26][26];//输入的原始图
char matrix[32][32];vector<char> ans;//建立拓扑排序的图 即更新into数组
void buildMap(Frame frame[])
{for (int i = 0; i < 26; ++i){//若此字母用过 if (used[i]){//遍历frame第一列和最后一列 for (int j = frame[i].x1; j <= frame[i].x2; ++j){if (matrix[j][frame[i].y1] != i+'A'){//要加这个判断条件,不然入度会被多算 如CBBC 则B的入度被算成了2其实是1 if (map[i][matrix[j][frame[i].y1]-'A'] == 0){//记录入度 into[matrix[j][frame[i].y1]-'A']++;//建图 map[i][matrix[j][frame[i].y1]-'A'] = 1;}}if (matrix[j][frame[i].y2] != i+'A'){if (map[i][matrix[j][frame[i].y2]-'A'] == 0) {into[matrix[j][frame[i].y2]-'A']++;map[i][matrix[j][frame[i].y2]-'A'] = 1;}}}//遍历frame第一行和最后一行 for (int j = frame[i].y1; j <= frame[i].y2; ++j){if (matrix[frame[i].x1][j] != i+'A'){if (map[i][matrix[frame[i].x1][j]-'A'] == 0){into[matrix[frame[i].x1][j]-'A']++;map[i][matrix[frame[i].x1][j]-'A'] = 1;}}if (matrix[frame[i].x2][j] != i+'A'){if (map[i][matrix[frame[i].x2][j]-'A'] == 0){into[matrix[frame[i].x2][j]-'A']++;map[i][matrix[frame[i].x2][j]-'A'] = 1;}}}}}
}    //depth用于判断递归了多少次
void topo(int depth, int count)
{//若递归的次数大于或等于所用字母的次数则可以结束if (depth >= count){copy(ans.begin(), ans.end(), ostream_iterator<char>(cout));cout << endl;return;}for (int i = 0; i < 26; ++i){if (used[i]){if (into[i] == 0)    {//删除入度为0的点所发出的边 ans.push_back(i+'A');into[i] = -1;for (int k = 0; k < 26; ++k){if (map[i][k] == 1){    into[k]--;}}topo(depth+1, count);//还原 ans.pop_back();into[i] = 0;for (int k = 0; k < 26; ++k){if (map[i][k] == 1){    into[k]++;}}                }}}
}int main()
{int n, m;while (scanf("%d",&n) != EOF){cin >> m;memset(used, 0, sizeof(used));memset(into, 0, sizeof(into));memset(map, 0, sizeof(map));memset(matrix, 0, sizeof(matrix));Frame frame[26];ans.clear(); string temp;for (int i = 0; i < n; ++i){cin >> temp;for (int j = 0; j < m; ++j){matrix[i][j] = temp[j];if (matrix[i][j] != '.'){int toNum = matrix[i][j]-'A';used[toNum] = true;//更新左上角和右下角 if (frame[toNum].x1 > i) frame[toNum].x1 = i;if (frame[toNum].y1 > j) frame[toNum].y1 = j;if (frame[toNum].x2 < i) frame[toNum].x2 = i;if (frame[toNum].y2 < j) frame[toNum].y2 = j;}}}buildMap(frame);//一共用了多少个字母 int count = 0;for (int i = 0; i < 26; ++i)if (used[i])count++;topo(0, count); }
}

转载于:https://www.cnblogs.com/767355675hutaishi/p/3813665.html

Frame Stacking 框架堆叠相关推荐

  1. javascript访问frame,iframe框架和href的定向

    一.frame 1.父框架到子框架的引用 知道了上述原理,从父框架引用子框架变的非常容易,即: window.frames["frameName"]; 这样就引用了页面内名为fra ...

  2. POJ 1128 Frame Stacking 拓扑排序+暴搜

    这道题输出特别坑.... 题目的意思也不太好理解.. 就解释一下输出吧.. 它让你 从下往上输出. 如果有多种情况,按照字典序从小往大输出... 就是这个多种情况是怎么产生的呢. 下面给一组样例. 很 ...

  3. .net frame work 框架各版本

    https://dotnet.microsoft.com/download/dotnet-framework

  4. html中的框架frameset和frame及iframe

    通过使用框架,你可以在同一个浏览器窗口中显示不止一个页面. 通过使用框架,你可以在同一个浏览器窗口中显示不止一个页面,简而言之,就是在一个窗口中显示多个页面. 每个页面称之为一个框架.并且每个框架独立 ...

  5. 运用frame、frameset框架不显示问题

    今天偶然用了一次frame\frameset框架标签,作为不常用标签,果然出问题了. 写了一个简单的测试demo,给大家分享一下出错的地方. 在默认页面中嵌入了三个frame,在浏览器跑起来,结果,页 ...

  6. RobotFramework学习笔记二:遇到Frame框架

    当元素存在frame/iframe框架内部时,RF会报找不到该元素,这时需要使用Select Frame 和Unselect Frame 关键字进行操作了. Select Frame 可以通过id n ...

  7. html框架集frame是啥意思,HTML框架frame与iframe详解

    HTML框架 框架简介 经过使用框架,你能够在同一个浏览器窗口中显示不止一个页面.每份HTML文档称为一个框架,而且每一个框架都独立于其余的框架. 使用框架的坏处:html 开发人员必须同时跟踪更多的 ...

  8. frame框架设计网页

    如何用框架设计网页 如图 首先设计一个两列的框架结构的网页 Frame.html 框架的结构 <frameset cols="250, 750" frameborder=&q ...

  9. 一文带你快速上手Highcharts框架

    前言 前端开发中,数据可视化尤为重要,最有效的方式可以通过图表库进行数据可视化,其中 ECharts.Highcharts 提供了丰富的图表,适用各种各样的功能,ECharts 相对来说基本可满足日常 ...

最新文章

  1. mac 制作usb启动盘_如何使用Mac制作Windows 10 USB-从Mac终端构建可启动的ISO
  2. 孪生素数 java代码_科学网—孪生素数猜想——利用 Java + 正则表达式 输出孪生素数对 - 马廷灿的博文...
  3. 安卓Design包下的TextInputLayout和FloatingActionButton的简单使用
  4. fastcgi协议分析与实例
  5. Coding 初级教程(二)——上传已有项目
  6. 水晶报表乱码中文乱码问题(收藏)
  7. PaddleOCR——申请显存不足【Allocate too much memory for the GPU memory pool, assigned 8000 MB】解决方案
  8. 深入理解Kafka(3)-Consumer
  9. 133. Clone Graph
  10. ai的预览模式切换_深耕基础办公领域,永中软件云端远程办公新模式助力企业复工复产...
  11. puts遇到空格无法输出_ACM输出超限|puts与printf
  12. java线程同步例子_JAVA线程同步实例教程
  13. 计算机网络 校园网规划,计算机网络课程校园网规划设计
  14. mysql分组查询n条记录
  15. web服务器的打开方法_西门子PLC固件升级,S71200 固件升级方法
  16. zabbix 2.4.5 自定义key监控redis
  17. 户籍管理员按1进入函数1c语言,户籍管理系统信息系统.doc
  18. Tomcat中的四大servlet容器及管道机制
  19. 基于JSoup的网络爬虫爬取小说内容
  20. 揭秘Microsoft Windows LDM

热门文章

  1. ACM字符串处理算法经典:字符串搜索
  2. setTimeout和setInteval
  3. 为什么一个实例只有一个LGWR
  4. (九)特征提取之主成分分析(PCA)
  5. 常见经典排序算法学习总结(插入、shell、冒泡、选择、归并、快排等)
  6. 岑溪高考成绩查询2021,2019岑溪高考成绩喜报(归义中学、筋竹中学、南
  7. matlab保存数据用什么指令_Matlab数据处理——数据的保存和读取方法操作
  8. vs2010调用python的方法
  9. java 输出一个爱心_java基础 之 几个常用的类
  10. 以二进制输出64位类型的数据_Java入门第五课:Java基本数据类型与变量的声明...