Frame Stacking 框架堆叠
/* 【题目来源】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 框架堆叠相关推荐
- javascript访问frame,iframe框架和href的定向
一.frame 1.父框架到子框架的引用 知道了上述原理,从父框架引用子框架变的非常容易,即: window.frames["frameName"]; 这样就引用了页面内名为fra ...
- POJ 1128 Frame Stacking 拓扑排序+暴搜
这道题输出特别坑.... 题目的意思也不太好理解.. 就解释一下输出吧.. 它让你 从下往上输出. 如果有多种情况,按照字典序从小往大输出... 就是这个多种情况是怎么产生的呢. 下面给一组样例. 很 ...
- .net frame work 框架各版本
https://dotnet.microsoft.com/download/dotnet-framework
- html中的框架frameset和frame及iframe
通过使用框架,你可以在同一个浏览器窗口中显示不止一个页面. 通过使用框架,你可以在同一个浏览器窗口中显示不止一个页面,简而言之,就是在一个窗口中显示多个页面. 每个页面称之为一个框架.并且每个框架独立 ...
- 运用frame、frameset框架不显示问题
今天偶然用了一次frame\frameset框架标签,作为不常用标签,果然出问题了. 写了一个简单的测试demo,给大家分享一下出错的地方. 在默认页面中嵌入了三个frame,在浏览器跑起来,结果,页 ...
- RobotFramework学习笔记二:遇到Frame框架
当元素存在frame/iframe框架内部时,RF会报找不到该元素,这时需要使用Select Frame 和Unselect Frame 关键字进行操作了. Select Frame 可以通过id n ...
- html框架集frame是啥意思,HTML框架frame与iframe详解
HTML框架 框架简介 经过使用框架,你能够在同一个浏览器窗口中显示不止一个页面.每份HTML文档称为一个框架,而且每一个框架都独立于其余的框架. 使用框架的坏处:html 开发人员必须同时跟踪更多的 ...
- frame框架设计网页
如何用框架设计网页 如图 首先设计一个两列的框架结构的网页 Frame.html 框架的结构 <frameset cols="250, 750" frameborder=&q ...
- 一文带你快速上手Highcharts框架
前言 前端开发中,数据可视化尤为重要,最有效的方式可以通过图表库进行数据可视化,其中 ECharts.Highcharts 提供了丰富的图表,适用各种各样的功能,ECharts 相对来说基本可满足日常 ...
最新文章
- mac 制作usb启动盘_如何使用Mac制作Windows 10 USB-从Mac终端构建可启动的ISO
- 孪生素数 java代码_科学网—孪生素数猜想——利用 Java + 正则表达式 输出孪生素数对 - 马廷灿的博文...
- 安卓Design包下的TextInputLayout和FloatingActionButton的简单使用
- fastcgi协议分析与实例
- Coding 初级教程(二)——上传已有项目
- 水晶报表乱码中文乱码问题(收藏)
- PaddleOCR——申请显存不足【Allocate too much memory for the GPU memory pool, assigned 8000 MB】解决方案
- 深入理解Kafka(3)-Consumer
- 133. Clone Graph
- ai的预览模式切换_深耕基础办公领域,永中软件云端远程办公新模式助力企业复工复产...
- puts遇到空格无法输出_ACM输出超限|puts与printf
- java线程同步例子_JAVA线程同步实例教程
- 计算机网络 校园网规划,计算机网络课程校园网规划设计
- mysql分组查询n条记录
- web服务器的打开方法_西门子PLC固件升级,S71200 固件升级方法
- zabbix 2.4.5 自定义key监控redis
- 户籍管理员按1进入函数1c语言,户籍管理系统信息系统.doc
- Tomcat中的四大servlet容器及管道机制
- 基于JSoup的网络爬虫爬取小说内容
- 揭秘Microsoft Windows LDM
热门文章
- ACM字符串处理算法经典:字符串搜索
- setTimeout和setInteval
- 为什么一个实例只有一个LGWR
- (九)特征提取之主成分分析(PCA)
- 常见经典排序算法学习总结(插入、shell、冒泡、选择、归并、快排等)
- 岑溪高考成绩查询2021,2019岑溪高考成绩喜报(归义中学、筋竹中学、南
- matlab保存数据用什么指令_Matlab数据处理——数据的保存和读取方法操作
- vs2010调用python的方法
- java 输出一个爱心_java基础 之 几个常用的类
- 以二进制输出64位类型的数据_Java入门第五课:Java基本数据类型与变量的声明...