USACO 4.4 Frame Up(拓扑排序,全部解)

2015-03-25 16:21:58

思路:题意是给出若干(<=26)个矩形框,而且这个框只有最外面的一圈,根据将他们堆叠后的俯视图像来推断这些框的堆叠方式。字典序输出所有可能。

  首先,题目保证根据俯视图你能确定每个矩形框的边长,那么我们开up,down,left,right四个数组来记录每个字母的最上/下/左/右的坐标,这样就可以确定矩形框的方位了。

  考虑用拓扑排序来做,那么如何建边呢?

  (1)扫描每个矩形框(设当前框为字母 i ),发现不同于 i 的字母 j ,那么说明 j 的框在 i 框上面,那么建边 j -> i。(表示把 j 框拿掉才能拿 i 框)

      所以,入度为0的字母框就是最上面的框,那么我们只要把拓扑排序看做一个不断“拿”框的过程即可。

  (2)由于题目要求求出所有解,那么考虑用DFS实现拓扑序,对每个入度为0的字母,DFS进去,并且在DFS过程中维护一个vector来存储解。

      当然,在遍历一个点之前将其删除,并根据其出边减掉相应点的入度。在回溯回来时要恢复遍历前的状态。

   (3)当发现已经遍历完所有点时要保存解,最后对解排序再输出。

  1 /*
  2 ID:naturec1
  3 PROG: frameup
  4 LANG: C++
  5 */
  6 #include <cstdio>
  7 #include <cstring>
  8 #include <cstdlib>
  9 #include <cmath>
 10 #include <vector>
 11 #include <map>
 12 #include <set>
 13 #include <stack>
 14 #include <queue>
 15 #include <string>
 16 #include <iostream>
 17 #include <algorithm>
 18 using namespace std;
 19 
 20 #define MEM(a,b) memset(a,b,sizeof(a))
 21 #define REP(i,n) for(int i=0;i<(n);++i)
 22 #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
 23 #define getmid(l,r) ((l) + ((r) - (l)) / 2)
 24 #define MP(a,b) make_pair(a,b)
 25 
 26 typedef long long ll;
 27 typedef pair<int,int> pii;
 28 const int INF = (1 << 30) - 1;
 29 
 30 char g[50][50];
 31 int W,H,tot;
 32 int id[30];
 33 int Up[30],Down[30],Left[30],Right[30];
 34 int mx[30][30];
 35 int deg[30],st_deg[30];
 36 vector<vector<int> > ans;
 37 vector<int> now_ans;
 38 
 39 void Add_edge(int p){
 40     int cur;
 41     for(int j = Left[p]; j <= Right[p]; ++j){
 42         cur = g[Up[p]][j] - 'A';
 43         if(cur != p) mx[cur][p] = 1;
 44         cur = g[Down[p]][j] - 'A';
 45         if(cur != p) mx[cur][p] = 1;
 46     }
 47     for(int i = Up[p]; i <= Down[p]; ++i){
 48         cur = g[i][Left[p]] - 'A';
 49         if(cur != p) mx[cur][p] = 1;
 50         cur = g[i][Right[p]] - 'A';
 51         if(cur != p) mx[cur][p] = 1;
 52     }
 53 }
 54 
 55 void Dfs(int p,int num){
 56     if(num >= tot){
 57         vector<int> tmp;
 58         for(int i = now_ans.size() - 1; i >= 0; --i)
 59             tmp.push_back(now_ans[i]);
 60         ans.push_back(tmp);
 61         return;
 62     }
 63     REP(i,26) if(id[i]){
 64         if(deg[i] == 0){
 65             now_ans.push_back(i);
 66             deg[i] = -1;
 67             REP(j,26) if(mx[i][j]) deg[j]--;
 68             //    
 69             Dfs(i,num + 1);
 70             //
 71             now_ans.pop_back();
 72             deg[i] = 0;
 73             REP(j,26) if(mx[i][j]) deg[j]++;
 74         }
 75     }
 76 }
 77 
 78 int main(){
 79     freopen("frameup.in","r",stdin);
 80     freopen("frameup.out","w",stdout);
 81     MEM(mx,0);
 82     MEM(id,0);
 83     scanf("%d%d",&H,&W);
 84     REP(i,H) scanf("%s",g[i]);
 85     REP(i,H) REP(j,W) if(g[i][j] != '.'){
 86         int cur = g[i][j] - 'A';
 87         if(id[cur] == 0){
 88             id[cur] = 1;
 89             ++tot;
 90             Up[cur] = Down[cur] = i;
 91             Left[cur] = Right[cur] = j;
 92         }
 93         else{
 94             Up[cur] = min(Up[cur],i);
 95             Down[cur] = max(Down[cur],i);
 96             Left[cur] = min(Left[cur],j);
 97             Right[cur] = max(Right[cur],j);
 98         }
 99     }
100     REP(i,26) if(id[i]) Add_edge(i);    
101     REP(i,26) REP(j,26) if(mx[i][j]) st_deg[j]++;
102     REP(i,26) if(id[i] && st_deg[i] == 0){
103         memcpy(deg,st_deg,sizeof(st_deg));
104         now_ans.clear();
105         now_ans.push_back(i);
106         deg[i] = -1;
107         REP(j,26) if(mx[i][j]) deg[j]--;
108         Dfs(i,1);
109     }
110     sort(ans.begin(),ans.end());
111     REP(i,ans.size()){
112         REP(j,tot) printf("%c",ans[i][j] + 'A');
113         puts("");
114     }
115     return 0;
116 }

 

转载于:https://www.cnblogs.com/naturepengchen/articles/4366141.html

PX4自定义uORB消息与MAVLink消息映射实战:从飞控到QGC地面站完整流程解析 本文详细解析PX4飞控中自定义uORB消息与MAVLink消息映射的完整流程,涵盖从飞控内部消息定义、MAVLink消息创建到QGC地面站接收显示的全链路实践。重点介绍如何使用mavlink inspector工具进行调试,解决版本兼容性和多实例消息处理等常见问题,为无人机开发者提供可靠的实时数据监控方案。 阅读详情

相关推荐

EPLAN Electric P8 2025安装避坑指南:硬件、.NET 6与VM配置全解析

EPLAN Electric P8 是面向工业自动化电气设计的工程级CAD平台,其核心依赖于.NET运行时、DirectX硬件加速与本地许可证验证机制。随着2025版升级至.NET 6.0 Runtime、DirectX 12渲染引擎及双模授权校验,安装失败率显著上升——尤其在显卡驱动陈旧、虚拟机环境或企业离线场景下。技术价值在于保障PLC柜体布局、端子排自动生成、电缆清册输出等产线级功能稳定运行;典型应用场景包括高校电赛控制系统设计、包装线电控图纸交付及集成商多版本协同部署。本文聚焦EPLAN 2025安

weixin_30897079的博客 553

USACO 4.4.3 Frame Up 重叠的图像 题解与分析

Frame Up 重叠的图像 译 by Felicia Crazy 描述 看下面的五张 9 x 8 的图像: ........ ........ ........ ........ .CCC.... EEEEEE.. ........ ........ ..BBBB.. .C.C.... E....E.. DDDDDD.. ....

初学者 1641

Mamba实战:如何用Samba框架轻松搞定RGB-D显著性检测(附避坑指南)

本文提供了基于Samba框架进行RGB-D显著性目标检测的实战指南。详细解析了从环境配置、数据预处理到模型推理与可视化的全流程,并重点剖析了多模态数据融合中的常见陷阱与调试技巧,旨在帮助开发者高效部署这一基于Mamba的先进视觉模型,规避工程实践中的典型问题。

dapp9builder的博客 615

洛谷Luogu-2741 [USACO4.4]重叠的图像Frame Up题解(详) HQG_AC的博客

https://www.luogu.org/problemnew/show/P2741这题整体难度不大,但有很多细的东西,所以容易错。1.读入矩阵2.求出有多少个图像(即矩阵中有多少种不同的字母),并从小到大排序3.t表示有几张图像,从1~t枚举出压在第i张图像上面的图像(x),构成拓扑结构,即i是x的入度,必须有i才有x4.做一遍dfs,搜出所有的可能:   ①枚举当前没有入度的节点(代码中是f...

Hacheylight 616

国产数据库PolarDB-X实战:5分钟快速搭建本地开发环境(附Docker一键部署脚本)

本文提供了一份详尽的国产分布式数据库PolarDB-X本地开发环境搭建指南。通过Docker Compose一键部署脚本,开发者可在5分钟内快速启动一个功能完整的PolarDB-X实例,涵盖环境准备、脚本解析、连接验证及日常维护,极大简化了国产数据库的入门和体验流程。

weixin_29246195的博客 358

samba源码编译安装(版本4.13.0)

这里写目录标题前言编译安装samba下载三个包安装依赖共需要安装samba、gnutls、nettle1、进入解压后的samba目录执行:2、进入解压后的gnutls目录执行3、进入解压后的nettle目录执行3.1 卸载已存在nettle3.2 编译3.3 make3.4 安装4、进入gnutls继续编译4.1 编译4.2 make4.3 安装5、再次进入解压后的samba目录5.1 执行./configure5.2 make5.3 samba安装启动samba 前言 一般来说,安装samba最快的方式应

灵葱的博客 1万+

Usaco Training Section 4.4 Frame Up

有一些长方形边框叠在一起,求放的顺序。 因为每个边框的每条边至少会出现一个字母,所以我们可以求出每个边框的准确位置。然后每次在未用过的边框中找只包含当前字母和已用字母的边框,标记为已用过,再把遇到的已用字母向当前字母连边。最后跑个dfs,求拓扑排序。 细节挺多的,一开始没想到拓扑排序,过了好一会儿才想到。然后p数组开小了,怎么也没发现,在usaco上竟然跑出来是wa,而不是re!!!在我的电脑...

Monster的博客 255

RC模型车多电机驱动方案:从电调PWM原理到四电机安全连接实战

在电机控制领域,PWM(脉冲宽度调制)是实现精确调速的核心技术。其原理是通过调节固定周期内高电平的脉宽来编码控制指令,进而驱动电子调速器(电调)改变输出功率。这项技术对于需要多电机协同工作的场景,如RC模型车的差速转向或重型负载驱动,具有关键价值。它能实现动力的精细分配与同步,提升车辆的可控性与通过性。在实际应用中,为确保系统稳定,必须关注电流分配与信号同步问题。例如,通过为每个电机配备独立电调并采用信号并联(Y线)的方式,可以构建可靠的四电机驱动系统。这种方案能有效避免因单个电调过载或电机反电动势不一致导

weixin_30664615的博客 381

usaco frame up(所有拓扑排序的输出)

先根据图建图再拓扑排序。 /** ID: jinbo wu TASK: frameup LANG:C++ */ #include using namespace std; map x1,x2,y3,y2,vis,v; char a[35][35]; int b[35][35]; char cnt[30]; int du[35]; bool vd[50]; int n,m,l; char ans

silence401的博客 729

华为私有云HCS 8.1.1实战:从镜像制作到云主机发放全流程指南

本文详细解析了华为私有云HCS 8.1.1从镜像制作到云主机发放的全流程实战指南。内容涵盖制作标准化QCOW2镜像、配置云主机规格与主机组、规划外部网络,以及在运营面为租户初始化资源、配置审批流与产品目录。最后,通过用户视角演示了从创建VPC网络到申请、审批并最终绑定EIP访问云主机的完整操作步骤,为运维人员和架构师提供了一套清晰、可落地的HCS部署与管理实践方案。

weixin_29305313的博客 1125

推荐系统中召回率Recall计算方式附代码

Recall(召回率)是指在所有实际有交互的用户 - 物品对中,推荐系统成功预测出的比例。具体来说,设所有有交互的用户 - 物品对为S,推荐系统预测出的用户 - 物品对为T,则Recall的计算公式为:

优快云 精品推荐 1842

Frame Up_usaco 4.4_拓扑排序

Description看下面的五张 9 x 8 的图像: 现在,把这些图像按照 1—5 的编号从下到上重叠,第 1 张在最下面,第 5 张在最顶端。如果一张图像覆盖了另外一张图像,那么底下的图像的一部分就变得不可见了。我们得到下面的图像: 对于这样一张图像,计算构成这张图像的矩形图像从底部到顶端堆叠的顺序。 下面是这道题目的规则: • 矩形的边的宽度为 1 ,每条边的

olahiuj的博客 755

华为OD机试双机位C卷-分披萨 (Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【分披萨】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为od机试 - 分披萨。

qq_45776114的博客 1396

USACO 4.4 Frame up Topological Sort

题目描述 看下面的五张 9 x 8 的图像: ........ ........ ........ ........ .CCC.... EEEEEE.. ........ ........ ..BBBB.. .C.C.... E....E.. DDDDDD.. ........ ..B..B.. .C.C.... E....E...

dianyi2475的博客 175

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

usaco 4.4 Frame Up(拓扑排序)

Frame Up Consider the following five picture frames shown on an 9 x 8 array: ........ ........ ........ ........ .CCC.... EEEEEE.. ........ ........ ..BBBB.. .C.C.... E....E.. DD

志当存高远 957

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【拓扑排序】洛谷 - P2741 [USACO4.4] 重叠的图像Frame Up

拓扑排序好好好题

TengMaxJun的博客 552

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Frame Up[USACO]

这道题没什么难度,开始看错了,以为要输出的是从上到下的顺序。我用的dfs,尝试把一个个矩形从当前图中拿出来,拿出来后将所在位置置为'*',在下次循环时需要恢复未拿走时的字符串。 /* ID: zhangyc1 LANG: C++ TASK: frameup */ #include <fstream> #include <iostream> #inc...

weixin_30270889的博客 312

Frame Up

题意:不想写,摘抄NOCOW翻译(http://www.nocow.cn/index.php/Translate:USACO/frameup) 描述 看下面的五张 9 x 8 的图像: ........ ........ ........ ........ .CCC.... EEEEEE.. ........ ........ ..BBBB.. .

原味 616

P2741 [USACO4.4] 重叠的图像 Frame Up

本文摘要:题目要求根据重叠后的9×8图像,反推出原始矩形(A-E)从下到上的堆叠顺序。每个矩形用大写字母表示,边宽为1且至少部分可见。算法核心是:1)提取各字母的边界坐标;2)从顶层开始识别,检查其边界的可见性;3)通过DFS递归处理剩余矩形,记录所有可能的堆叠顺序;4)按字典序输出结果。示例输入输出显示正确顺序为EDABC。代码实现了边界检测、可见性验证和深度优先搜索,确保在合理时间内找到所有解。

as673456的博客 547

USACO 4.4 Frame Up(拓扑排序)

终于结束了第4章。。倒数第二个题,卡了2个月。。。 这个题,实现起来,还挺麻烦的,看懂题意,建好图,就是裸的拓扑排序了。 1 /* 2 ID:cuizhe 3 LANG: C++ 4 TASK: frameup 5 */ 6 #include <cstdio> 7 #include <cstring> 8 #i...

weixin_30571465的博客 499

USACO 4.4 Frame Up (拓扑排序)

Frame Up Consider the following five picture frames shown on an 9 x 8 array: ........ ........ ........ ........ .CCC.... EEEEEE.. ........ ........ ..BBBB.. .C.C.... E....E....

weixin_30341745的博客 114

【USACO题库】4.4.3 Frame Up重叠的图像

不太好复制,所以用截图 (直接用屏幕截图截的) 这题感觉不会很难,但为什么只有6个人做出来。。。 题意: 有若干个空心的长方形(宽度=1,边长≥3)叠在一起,已知最后的图形,求长方形叠放的顺序。 题解: 因为一个长方形有可能会被其它的长方形所覆盖一部分(不可能完全覆盖),所以我们先在读入时记录下每一个长方形左上角顶点的坐标和右下角顶点的坐标(找最大和最小

某司机的黑车 935

USACO4.4.3 Frame Up (frameup)

用1~26表示每种字母 统计每种字母的最小与最大的x与y坐标,这样就知道了每个矩形的边框。 从最上层开始dfs,找到当前所有边框上都是同样数字的矩形,则这个矩形一定是最上层的,继续dfs。 每次dfs找到一个矩形时,将该矩形的边框上的所有数字设为负数,负数可以看作是任何一种数字。回溯时再还原。 dfs到最后一层时记录答案,最后排序输出。/* ID:shijiey1 LANG:C++ PRO

Shion的专栏 578

usaco training 4.4.3 Frame Up 题解

序言:这道题的完结,预示着我的第四版旅程宣告结束!! 刚看到题目后,我就直接想到了类似于搜索的算法,每次去寻找”浮在最上面“的某个字母并继续搜索。但是我后来发现这样实现起来有点困难,因为没有特别的规划性。后来我就想到了拓扑。如果在某个字符A的边上找到了B,那么就从B向A连一条边。每次寻找入度为0的字母并释放该字母在其他字母上方的痕迹。 需要注意的是,输出时要把所有情况按字典序全部打印。因为拓扑与打印顺序相反,我本来以为拓扑时每次从Z枚举至A就会一定有序,后来发现有点问题。最后,我还是用了排序。

阿蒋的专栏 1857

USACO Section 4.4 Frame Up - DFS即可~

无敌大水题一道...只可惜我太粗心了送了3次WA和1次爆数组才给过...囧..开始题目看错了...题目是要求出所有的涂色方案...并且按字典序输出..一种方案输出一行~~     数据范围很小阿..整个图也就30*30...所出现的也就A-Z的26个大写字母..而且还没有重复...为了方便搜索..我在开始就记录好了A-Z矩形方框的X,Y最大值和最小值~~也就是定位好了每个框框...然后就一个个枚

zzyzzy12 1310

USACO算法系列四十——frameup

<br />    题目:http://www.nocow.cn/index.php/Translate:USACO/frameup<br />    第一次理解这道题目的时候理解错了。这句话很关键:“矩形的每条边中,至少有一部分是可见的。注意,一个角同时属于两条边。”<br />    也就是说每条边至少有一个点是可见的,这样我们就可以确定出矩形的边框。<br />    这样就可以确定出整个矩形,然后利用深度遍历的方法,搜索出所有的答案。<br />    代码如下:<br />#include <io

止于至善 540
上一篇: POJ--3481(Treap / other trees / STL)
下一篇: USACO 4.4 Pollutant Control(最小割,求最优解)
dingdi3021
博客等级 码龄11年 1粉丝 230原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值