UVA - 101:The Blocks Problem

原本以为是一道很简单的模拟题,结果写了一个小时。。。很长时间不碰算法题,的确手感差很多。不过我觉得随着刷题慢慢多起来应该会好的。

题目的意思也有点含糊,需要自己去猜,大概意思就是槽里有一堆木头,每个槽刚开始的时候只有一个,需要移过来移过去,有四种方式,这四种方式都是针对木头而言的,因此我们必须时刻记录每个木头的位置。当然还需要数据结构记录槽的状态,最后需要输出。

四种移动方式有一些是共通的,因此需要将其抽象成函数,我这里抽象了三个函数:

void ret_block(int x);

将木头x头顶的木头归还到原本的槽里面(i号木头到i号槽)

void mve(int x, int idx);

将木头x移动到槽idx的位置,之所以不叫move是因为不想和标准库的move函数冲突

void pile(int x, int idx);

将木头x以及其头顶的所有木头移动到槽idx

虽然使用三个函数简化了四种操作,但是我觉得自己分离的不够清晰,按道理讲pile函数应该调用mve函数,因为一个是移动一个木头,一个是移动一堆木头,可是因为使用的是vector,导致无法随机插入。

顺带吐槽一下:我为了控制不输出最后的换行专门写了一个Newline函数类,但是直接报错。。有的OJ要求不能有,有的又要求必须有。。

看了一下别人的题解,有两点收获:

  • 不用判断整个字符串再确定是什么命令,判断一下首字母就可以了
  • 可以使用erase函数整块删除。自己就是因为不知道这个函数写的比较复杂,还是要对STL更加熟悉才行
    再研究了一下书上的题解,发现果然pile函数可以和move函数合并,而且可是使用resize函数进行删除。

对于这种多种指令的,我们要提取出指令之间的共同点,编写函数以减少重复代码。

#include <iostream>
#include <vector>
#include <string>
#include <array>using namespace std;namespace {const string QUIT = "quit";const string MOVE = "move";const string ONTO = "onto";const string OVER = "over";const string PILE = "pile";constexpr int MAXN = 25 + 5;array<vector<int>, MAXN> blocks;array<pair<int, int>, MAXN> pos;int n;
}void init() {cin >> n;for (int i = 0; i < n; ++i) {blocks[i].push_back(i);pos[i] = {i, 0};}
}void mve(int x, int idx) {blocks[idx].push_back(x);blocks[pos[x].first].pop_back();pos[x].first = idx;pos[x].second = blocks[idx].size() - 1;
}void pile(int x, int idx) {auto &block_x = blocks[pos[x].first];auto &block_dst = blocks[idx];int origin_pos = pos[x].second;int y;for (int i = origin_pos; i < block_x.size(); ++i) {y = block_x[i];block_dst.push_back(y);pos[y].first = idx;pos[y].second = block_dst.size() - 1;}for (int i = block_x.size() - 1; i >= origin_pos; --i) block_x.pop_back();
}void ret_block(int x) {//return blocks that are stacked on top of xauto &block_x = blocks[pos[x].first];int y;for (int i = block_x.size() - 1; i > pos[x].second; --i) {y = block_x.back();mve(y, y);}
}void work() {int x, y;string action, prep;while (cin >> action) {if (action == QUIT) break;cin >> x >> prep >> y;if (pos[x].first == pos[y].first) continue;if (action == MOVE) {if (prep == ONTO) {//move x onto yret_block(x);ret_block(y);mve(x, pos[y].first);} else {ret_block(x);mve(x, pos[y].first);}} else {if (prep == ONTO) {ret_block(y);pile(x, pos[y].first);} else {pile(x, pos[y].first);}}}
}class Newline {bool first;
public:Newline(bool _fisrt = true):first(_fisrt) {}inline void operator ()();
};inline void Newline::operator()() {if (first) {first = false;} else {cout << "\n";}
}void print() {Newline newline;for (int i = 0; i < n; ++i) {//newline();cout << i << ":";for (auto x : blocks[i]) {cout << " " << x;}cout << "\n";}
}int main() {ios::sync_with_stdio(false);init();work();print();
}

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

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

相关文章

UVA - 12096:The SetStack Computer

题目描述很简单&#xff0c;难点在于如何对集合进行编码&#xff0c;因为是无限的&#xff0c;好像没有一个方向进行编码。 紫书给的题解十分巧妙&#xff1a;给新出现的集合进行编码 的确&#xff0c;我们没有必要为所有可能出现的集合编码后再开始&#xff0c;我们就可以简单…

UVA - 540:Team Queue

主要的关键在于&#xff1a;不要试图让所有团队的人在一个队列里面&#xff0c;因为这样如果新入队的是一个前面团队的成员则必须先出队再入队。 应该把每个团队看做一个整体&#xff0c;用一个队列维护团队的顺序&#xff0c;用t个队列维护每个团队内部的顺序。 还有就是要维…

UVA-136:Ugly Numbers

很简单的一道题&#xff0c;但是我竟然蠢到想不明白为什么如果从头生成会出现大量重复的数字。 写的时候主要出现的错误在爆int上&#xff0c;一定要注意数据范围。 #include <iostream> #include <queue> #include <set>using namespace std; using ll lo…

类的成员函数可以访问属于该类的任意对象的私有变量

之前在书上看到成员函数可以访问类的私有变量的时候觉得是废话嘛&#xff0c;如果成员函数都不能访问那私有变量不就变成了花瓶了。然而发现自己还是太naive。 这句话的意思是&#xff1a;在类的作用域内&#xff0c;包含成员函数、静态成员函数和友元函数内&#xff0c;可以访…

GMP使用入门

最近写了一个高精度的模板&#xff0c;想要用GMP库测试一下&#xff0c;总结一下GMP环境的搭建。 环境搭建&#xff1a;GMP大法教你重新做人(从入门到实战) 解压.tar.lz的 时候可能会遇到一点问题&#xff0c;可以参考这个博客&#xff1a;.tar.lz压缩包解压 需要注意的是C需要…

UVA - 400:Unix ls

题目的难点在于要求前面的每一列的是最大长度L2&#xff0c;最后一列的长度是L。对于宽度为WIDTH60的一行来说&#xff0c;一行可以放下多少个单词决定了需要多少行&#xff0c;知道了行数才能开始根据行数开始放置。 我的做法是col (WIDTH 2) / (L 2)&#xff0c;即提前给W…

UVA - 1592:Database

题目的意思是找到两行在两列处相等&#xff0c;主要要做的是记录某个值是否重复出现过。 经过思考&#xff0c;我的思路是&#xff1a;每一列用一个unordered_map<string,vector<int>>记录单词出现的行数&#xff0c;对于某一行中的两列&#xff0c;如果有两个元素…

C++ array初始化需要双层大括号

对于array的初始化我们可以使用列表初始化&#xff1a; array<int, 8> test {1,2,3,4,5,6,7,8 };但是当我们不再使用简单的内置类型array时&#xff1a; array<pair<int, int>, 8> dirs {{-1, -1},{-1, 0},{-1, 1},{0, -1},{0, 1},{1, -1},{1, 0},{1, 1}…

Qt for Android环境配置

最近想写一个小APP&#xff0c;但是又不想用Android Studio进行开发&#xff0c;想要用C进行开发&#xff0c;听说Qt可以进行Android开发&#xff0c;就想尝试一下&#xff0c;结果花了一天时间来配置环境。。。而且发现windows下配置环境更简单一些&#xff08;我中途还切换到…

UVa-12333:Revenge of Fibonacci 高精度

之前自己仿照紫书上写了高精度库&#xff0c;完善了乘法、减法&#xff0c;并且通过了和C高精度库GMP的对拍测试&#xff0c;并在一些OJ上过了一些高精度的模板题&#xff0c;代码仓库地址&#xff1a;https://github.com/Edward-Elric233/BigInt 求解思路 题目的意思是求前1…

vim命令笔记

vim折叠函数&#xff1a;https://www.cnblogs.com/zlcxbb/p/6442092.html Vim录制宏及使用&#xff1a;https://www.jianshu.com/p/9d999c72a9f3 将vim与系统剪贴板的交互使用&#xff1a;https://zhuanlan.zhihu.com/p/73984381

Educational Codeforces Round 114总结

绪论 https://codeforces.com/contest/1574/ 以前想要打CF&#xff0c;总是觉得没有时间&#xff0c;要做这个&#xff0c;要做那个&#xff0c;现在时间充裕了一些&#xff0c;想要多打一些CF&#xff0c;但是光打比赛不总结是没有什么帮助的&#xff0c;这是我从以前的ACM训…

UVA - 210:Concurrency Simulator

题目链接&#xff1a;https://vjudge.net/problem/UVA-210 题目分析 就是一道模拟题&#xff0c;但是细节有点多。 写代码两个小时&#xff0c;调试代码用了两天。。。很长时间不刷题了&#xff0c;这道虽然算法简单但是细节满满的题目对我来说是一个很好的热身。 尽量不要去…

UVA - 514:Rails

题目链接&#xff1a;https://vjudge.net/problem/UVA-514 题目分析 题目的意思是给一个栈输入一系列数据&#xff0c;在这个过程中可以出栈&#xff0c;看能否达到某个结果。 刚开始我觉得这个情况好多&#xff0c;因此不是用模拟&#xff0c;而应该观察结果本身。对于结果中…

UVA - 442:Matrix Chain Multiplication

题目链接&#xff1a;https://vjudge.net/problem/UVA-442 题目分析 题目的意思非常简单&#xff0c;就是给定一个矩阵乘法的表达式然后计算就可以了。随便写写 AC代码 #include <iostream> #include <deque> #include <vector> #include <string>…

leetcode869. 重新排序得到 2 的幂

题目连接&#xff1a;https://leetcode-cn.com/problems/reordered-power-of-2/ 题目分析 如果直接顺着题目的思路&#xff0c;得到数字n的全排列&#xff0c;然后再去判断其是不是2的幂是比较复杂的。 我们应该注意到&#xff0c;因为数字是可以随意排列的&#xff0c;因此所…

使用wireshark+ssh+tcpdump远程抓包

因为需要抓取远程服务器上的数据包&#xff0c;又不想使用tcpdump这种命令行工具进行&#xff08;用了wireshark后谁还愿意去看密密麻麻的命令行呢&#xff09;&#xff0c;所以在网上查找了一下使用wireshark远程抓包的方法&#xff0c;在这里记录一下。 原生支持 wireshark…

C++ Variadic Templates(可变参数模板)

本文参考侯捷老师的视频&#xff1a;https://www.youtube.com/watch?vTJIb9TGfDIw&listPL-X74YXt4LVYo_bk-jHMV5T3LHRYRbZoH 以及C primer第五版 相关内容。 可变参数模板函数 //递归的终止条件 void print() {} //Variadic Templates //一般用于递归处理 template <…

Ubuntu修复Fix Busybox Initramfs错误

今天早上我打开电脑&#xff0c;进入Ubuntu系统&#xff0c;结果黑屏了&#xff0c;屏幕显示&#xff1a; BusyBox v1.30.1 (Ubuntu 1:1.30.1-4ubuntu6.1) built-in shell (ash) Enter help for a list of built-in commands.(initramfs)然而我并不知道这个是什么意思&#x…

Leetcode第284场周赛

绪论 最近发现Leetcode每周的周赛难度挺适合我的&#xff0c;而且时间也比较友好&#xff08;不像Codeforces每次都是半夜&#xff09;。所以连续参加了三周的周赛。这次才想起来应该记录一下自己的参赛历程。一方面是总结经验&#xff0c;另一方面有了记录就更有动力去提升&a…