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.pswp.cn/news/383538.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383538.shtml
英文地址,請注明出處:http://en.pswp.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…