The Blocks Problem

本题是一道模拟题,但个人感觉挺有意思的(思路很明确,但是WA了好几发才过),因此来讲一讲思路。

题面

题面PDF
在这里插入图片描述

样例输入

10
move 9 onto 1
move 8 over 1
move 7 over 1
move 6 over 1
pile 8 over 6
pile 8 over 5
move 2 over 1
move 4 over 9
quit

样例输出

0: 0
1: 1 9 2 4
2:
3: 3
4:
5: 5 8 7 6
6:
7:
8:
9:

题意简述

初始时从左到右有 n n n 个木块,编号分别为 0 … n − 1 0 \ldots n-1 0n1,要求实现下列四种操作:

  1. move a onto b : 把 a a a b b b 上方的木块归位,然后把 a a a 放到 b b b 上面。
  2. move a over b : 把 a a a 上方的木块归位,然后把 a a a 放在 b b b 所在木块堆的最上方。
  3. pile a onto b : 把 b b b 上方的木块归位,然后把 a a a 及以上的木块坨到 b b b 上面。
  4. pile a over b : 把 a a a 及以上的木块坨到 b b b 的上面。

一组数据的结束标志为 quit,如果有非法指令(如 a a a b b b 在同一堆),无需处理。

输出:所有操作输入完毕后,从左到右,从下到上输出每个位置的木块编号。

思路

通过观察上面四种操作,我们会发现,这四种操作可以拆分为三种:

  • move x x x:将木块x上面木块归位。
  • pile x x x:无操作。
  • onto x x x:将木块x上面的木块归位。
  • over x x x:无操作。

然后我们还会发现,无论哪个操作,最终都会将a放在b上边。

因此,上边的操作就转换为了两类:归位合并。然后我们实现这两种操作即可。

而这两种操作显然用 v e c t o r vector vector容器比较方便,因此我们尝试用 v e c t o r vector vector来实现。标程里有详细代码+注释,请放心食用。

标程

#include<bits/stdc++.h>using namespace std;#define IOS ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
#define LL long long 
#define ULL unsigned long long 
#define PII pair<int, int>
#define lowbit(x) (x & -x)
#define Mid ((l + r) >> 1)
#define ALL(x) x.begin(), x.end()
#define endl '\n'
#define fi first 
#define se secondconst int INF = 0x7fffffff;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;vector<vector<int>> a(30);	//用二维vector,第一维表示原位置,第二维表示当前位置堆的木块
int n, x1, x2;PII find(int x) {							//找到需要进行操作的木块的位置for(int i = 0; i < n; i ++ )for(int j = 0; j < a[i].size(); j ++ )if(a[i][j] == x) return {i, j};	//第i堆的第j个
}void homing(PII i) {					//归位操作while(a[i.fi].size() - 1 > i.se) {int t = a[i.fi].back();a[t].push_back(t);				//将其后边的全都归位,本身不动a[i.fi].pop_back();}
}void merge(PII i, PII j) {				//合并操作for(int k = i.se; k < a[i.fi].size(); k ++ ) {int t = a[i.fi][k];a[j.fi].push_back(t);}a[i.fi].resize(i.se);				//将其大小设为i.se,相当于舍弃后面的元素
}void Solved() {cin >> n;string s1, s2;for(int i = 0; i < n; i ++ ) a[i].push_back(i);//初始化while(cin >> s1) {if(s1 == "quit") break;cin >> x1 >> s2 >> x2;PII y1 = find(x1), y2 = find(x2);	//如果在同一堆的话是没办法进行操作的if(y1.fi == y2.fi) continue;if(s2 == "onto") homing(y2);		//需要先对b进行操作if(s1 == "move") homing(y1);merge(y1, y2);}for(int i = 0; i < n; i ++ ) {//输出cout << i << ":";for(int j : a[i]) cout << " " << j;cout << endl;}
}signed main(void) {IOSint ALL = 1; // cin >> ALL;while(ALL -- ) Solved();// cout << fixed;//强制以小数形式显示// cout << setprecision(n); //保留n位小数return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/414142.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT与文心一言:AI助手之巅的对决

随着科技的飞速发展&#xff0c;人工智能助手已经渗透到我们的日常生活和工作中。 而在这个充满竞争的领域里&#xff0c;ChatGPT和文心一言无疑是最引人注目的两款产品。它们各自拥有独特的优势&#xff0c;但在智能回复、语言准确性、知识库丰富度等方面却存在差异。那么&am…

【新书推荐】Web3.0应用开发实战(从Web 2.0到Web 3.0)

第一部分 Flask简介 第1章 安装 1.1 创建应用目录 1.2 虚拟环境 1.2.1 创建虚拟环境 1.2.2 使用虚拟环境 1.3 使用pip安装Python包 1.4 使用pipregs输出包 1.5 使用requirements.txt 1.6 使用pipenv管理包 第2章 应用的基本结构 2.1 网页显示过程 2.2 初始化 2.3 路由和视图函数…

保姆版Vps安装灯塔(ARL)

因为灯塔的默认端口为5003&#xff0c;所以我们在安装之前就在防火墙里把我们的5003端口打开 打开端口步骤如下&#xff1a; 1.我们打开控制面板&#xff0c;在控制面板里点击 系统和安全 。如下图&#xff1a; 2.接着点击 Windows Defender防火墙,如下图&#xff1a; 3.再…

spring boot学习第八篇:kafka监听消费

为了实现监听器功能 pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLoc…

代码随想录 Leetcode459. 重复的子字符串(KMP算法)

题目&#xff1a; 代码&#xff08;首刷看解析 KMP算法 2024年1月18日&#xff09;&#xff1a; class Solution { public:void getNext(string& s,vector<int>& next) {int j 0;next[0] j;for (int i 1; i < s.size(); i) {while (j > 0 && s…

Java的便捷输入方法及解析

在 Java 中&#xff0c;有多种便捷的输入方法可以从用户那里获取输入。下面是一些常见的便捷输入方法及解析&#xff1a; 使用 Scanner 类&#xff1a;在上述示例中&#xff0c;首先导入了 java.util.Scanner 类&#xff0c;创建了一个 Scanner 对象&#xff0c;并使用 System…

服务器数据恢复—OceanStor存储raid5热备盘同步数据失败的数据恢复案例

服务器数据恢复环境&#xff1a; 华为OceanStor某型号存储&#xff0c;存储内有一组由24块硬盘组建的raid5阵列&#xff0c;配置1块热备盘。 服务器故障&#xff1a; 该存储raid5阵列中有一块硬盘离线&#xff0c;热备盘自动激活并开始同步数据&#xff0c;在热备盘同步数据的…

【面试合集】说说 linux 系统下 文本编辑常用的命令有哪些?

面试官&#xff1a;说说 linux 系统下 文本编辑常用的命令有哪些&#xff1f; 一、是什么 Vim是从 vi 发展出来的一个文本编辑器&#xff0c;代码补全、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。 简单的来说&#xff0c; vi 是老式的字处理…

ELK之Filebeat输出日志格式设置及输出字段过滤和修改

一、Filebeat输出日志格式设置 1.1 编辑vim filebeat.yml文件,修改输出格式设置 # output to console output.console:codec.format: string: %{[@timestamp]} %{[message]}pretty: true### 1.2 测试 执行 ./filebeat -e 可以看到/tmp/access.log(目前文件里只有140.77.188…

指针取值运算符*和++运算符的优先级

参考文章&#xff1a; C语言中 和 * 的优先级_c玉莹 和*优先级-CSDN博客 写的不详细&#xff0c;或者有不对。 具体说&#xff0c;*和是同等优先级&#xff0c;是对的。但是&#xff0c;在实际组合时&#xff0c;是看哪个和变量结合近&#xff0c;就优先执行哪个。如果一样…

Transformer原理与代码实现

Transformer原理与代码实现 概览 一、嵌入层 Embedding 二、位置编码 Positional Encoding 三、&#xff08;整合&#xff09;Transformer嵌入层 Transformer Embedding 四、带缩放的点积注意力机制 Scaled Dot-Product Attention 五、多头注意力 Multi-Head Attention 六…

SSH数据流量监控

简介 检查网络连接的数据传输情况有以下一些实际意义&#xff1a; 安全监控&#xff1a;检查数据传输情况可以帮助你识别异常活动或潜在的安全威胁。如果发现大量不寻常的数据传输活动&#xff0c;可能表示有未经授权的访问或恶意行为。通过监控数据传输&#xff0c;可以及时发…