一份重要文件被撕成两半,其中一半还被送进了碎纸机。我们将碎纸机里找到的纸条进行编号,如图 1 所示。然后根据断口的折线形状跟没有切碎的半张纸进行匹配,最后还原成图 2 的样子。要求你输出还原后纸条的正确拼接顺序。

输入格式:
输入首先在第一行中给出一个正整数 N(1<N≤10​5​​),为没有切碎的半张纸上断口折线角点的个数;随后一行给出从左到右 N 个折线角点的高度值(均为不超过 100 的非负整数)。

随后一行给出一个正整数 M(≤100),为碎纸机里的纸条数量。接下去有 M 行,其中第 i 行给出编号为 i(1≤i≤M)的纸条的断口信息,格式为:
K h[1] h[2] … h[K]
其中 K 是断口折线角点的个数(不超过 104 +1),后面是从左到右 K 个折线角点的高度值。为简单起见,这个“高度”跟没有切碎的半张纸上断口折线角点的高度是一致的。

输出格式:
在一行中输出还原后纸条的正确拼接顺序。纸条编号间以一个空格分隔,行首尾不得有多余空格。题目数据保证存在唯一解。

输入样例:
17
95 70 80 97 97 68 58 58 80 72 88 81 81 68 68 60 80
6
4 68 58 58 80
3 81 68 68
3 95 70 80
3 68 60 80
5 80 72 88 81 81
4 80 97 97 68

输出样例:
3 6 1 5 2 4

分析:h[i]存储第i个折线角点的高度,frag[i]存储第i个纸条碎片的信息。通过DFS从没有切碎的纸片最左端开始尝试所有纸条碎片的匹配,p表示当前所需要匹配的碎片左侧在未碎纸片上的位置,将匹配上的纸条碎片编号添加到Ans中记录,并使用vis标记是否已经匹配上了,如果Ans的容量等于纸片数量,则表示已经完成所有匹配,输出结果并返回~

#include <bits/stdc++.h>
using namespace std;
int n, m, k, t, flag1, flag2;
int h[100001], vis[101];
vector<int> Ans, frag[101];
void DFS (int p) {if ((int)Ans.size() == m) {flag1 = 1;for (int i = 0; i < m; i++) {if (i) cout << ' ';cout << Ans[i];}}if (flag1) return;for (int i = 1; i <= m; i++) {if (vis[i]) continue;flag2= 0;for (int j = 0; j < (int)frag[i].size(); j++) {if (frag[i][j] != h[p + j]) {flag2 = 1;break;}}if (flag2) continue;Ans.push_back(i);vis[i] = 1;DFS(p + (int)frag[i].size() - 1);vis[i] = 0;Ans.pop_back();}
};
int main() {cin >> n;for (int i = 0; i < n; i++) cin >> h[i];cin >> m;for (int i = 1; i<= m; i++) {cin >> k;for (int j = 0; j < k; j++) {cin >> t;frag[i].push_back(t);}}DFS(0);return 0;
}

L3-029 还原文件 (30 分)-PAT 团体程序设计天梯赛 GPLT相关推荐

  1. L3-011 直捣黄龙 (30 分)-PAT 团体程序设计天梯赛 GPLT

    本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求选择可以沿途解放最多城镇 ...

  2. L3-017 森森快递 (30 分)-PAT 团体程序设计天梯赛 GPLT

    森森开了一家快递公司,叫森森快递.因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号.由于道路限制,第i号城市(i=0,⋯,N−2)与第(i ...

  3. L3-012 水果忍者 (30 分)-PAT 团体程序设计天梯赛 GPLT

    2010年风靡全球的"水果忍者"游戏,想必大家肯定都玩过吧?(没玩过也没关系啦~)在游戏当中,画面里会随机地弹射出一系列的水果与炸弹,玩家尽可能砍掉所有的水果而避免砍中炸弹,就可以 ...

  4. L3-021 神坛 (30 分)-PAT 团体程序设计天梯赛 GPLT

    在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...

  5. L3-020 至多删三个字符 (30 分)-PAT 团体程序设计天梯赛 GPLT

    给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 106] 内的字符串. ...

  6. L3-016 二叉搜索树的结构 (30 分)-PAT 团体程序设计天梯赛 GPLT

    二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...

  7. L3-009 长城 (30 分)-PAT 团体程序设计天梯赛 GPLT

    正如我们所知,中国古代长城的建造是为了抵御外敌入侵.在长城上,建造了许多烽火台.每个烽火台都监视着一个特定的地区范围.一旦某个地区有外敌入侵,值守在对应烽火台上的士兵就会将敌情通报给周围的烽火台,并迅 ...

  8. L3-006 迎风一刀斩 (30 分)-PAT 团体程序设计天梯赛 GPLT

    迎着一面矩形的大旗一刀斩下,如果你的刀够快的话,这笔直一刀可以切出两块多边形的残片.反过来说,如果有人拿着两块残片来吹牛,说这是自己迎风一刀斩落的,你能检查一下这是不是真的吗? 注意摆在你面前的两个多 ...

  9. L3-023 计算图 (30 分)--PAT 团体程序设计天梯赛 GPLT

    "计算图"(computational graph)是现代深度学习系统的基础执行引擎,提供了一种表示任意数学表达式的方法,例如用有向无环图表示的神经网络. 图中的节点表示基本操作或 ...

最新文章

  1. oracle 分组排序 update,oracle分组排序
  2. 大数据时代 安全与应用的博弈
  3. 二叉树最近公共祖先节点
  4. CF1101D GCD Counting
  5. Python:错误FileNotFoundError: [Errno 2] No such file or directory: 'objects/epsilon.pkl
  6. 二十一、Python中的Scipy统计库
  7. 浅谈Java中equals()和==的区别
  8. 深度学习端上部署工具
  9. hooks组件封装 react_react-hooks amp; context 编写可复用react组件的一种实践
  10. Operators一句话介绍(RxJava版)
  11. 在Linux系统中安装caffe
  12. 华为harmonyOS开发者日,华为首届HarmonyOS开发者创新大赛收官
  13. CF1132G Greedy Subsequences
  14. VMware Server1.03下载地址及序列号
  15. Frenet Frame
  16. ibm服务器刷主板系统,IBM X3850 X5服务器更换主板后修改主板信息
  17. makefile的简单编写
  18. 关于python函数参数的描述中、错误的是_在Python中,以下关于函数的描述错误的是哪一项?...
  19. Linux高级命令find,grep,sed,awk
  20. 51单片机 ADC0832酒精传感器

热门文章

  1. Updater Application Block for .net 2.0 发布了
  2. Android学习导航线路
  3. TextureUnpacker 分割 Texturepacker 产生的图片 支持windows 和 mac
  4. Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果
  5. onCreate onRestoreInstanceState onSaveInstanceState
  6. centos 6.5 安装rsync
  7. Gandi下配置Github pages的自定义域名
  8. 第19章 可空值类型
  9. WPF MVVM 验证
  10. AngularJS内置指令 ng-xxx