Uva 101 the block problem 木块问题

题目大意:

输入n,得到编号为0~n-1的木块,分别摆放在顺序排列编号为0~n-1的位置。现对这些木块进行操作,操作分为四种。

1、move a onto b:把木块a、b上的木块放回各自的原位,再把a放到b上;

2、move a over b:把a上的木块放回各自的原位,再把a发到含b的堆上;

3、pile a onto b:把b上的木块放回各自的原位,再把a连同a上的木块移到b上;

4、pile a over b:把a连同a上木块移到含b的堆上。

当输入quit时,结束操作并输出0~n-1的位置上的木块情况

Sample Input 
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
Sample Output 
 0: 0
 1: 1 9 2 4
 2:
 3: 3
 4:
 5: 5 8 7 6
 6:
 7:
 8:
 9:

思路:

第一次刷题,思路比较乱,写得挺久的,比较多地参考了几位前辈在CSDN上提供的思路。

首先用一个vector容器存放元素(vector <int> v[30]),用rec(record)数组记录每个元素现在所处的位置(rec[ i ] = j 即 第 i 个木块现在在第 j 个位置上)。

clear函数:

void clear(int i):rec[ i ] (= j )指示将第 i 个木块现在正在 j 位置,检查v[ rec[i] ]的顶层木箱,如果不是 i 木箱,则将它移回原位,同时修改rec,保持同步。

Find函数:

VEC Find(vector<int>& vec, int num):搜寻num元素在vec中的位置并返回,如果没找到,返回vec.begin() - 1

check函数:

输出结果。

如果要把a上元素及a一起挪动到b上,可以建立一个临时数组tmp来储存a顶上元素(从上往下存),同时修改rec位置为即将被放入的b的位置。然后将tmp中的元素倒序放入b上。

#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
typedef vector<int>::iterator VEC;  vector <int> v[30];
int rec[30];  // rec[i]用于记录第i个元素现在所在的位置 v[rec[i]];
int n;  VEC Find(vector<int>& vec, int num)
{for(VEC i = vec.begin(); i != vec.end(); i++)if(*i == num){   return i;   }return vec.begin() - 1;
}void check(){for(int i = 0; i < n; i++){cout << i << ": ";if(v[i].empty()) {cout << endl;continue;}for(int j = 0; j < v[i].size(); j++)cout << v[i][j] << " ";cout << endl;}
}void clear(int i)
{while(v[rec[i]].back() != i)                                 //back:得到数组的最后一个单元的引用{rec[v[rec[i]].back()] == v[rec[i]].back();v[v[rec[i]].back()].push_back(v[rec[i]].back());v[rec[i]].pop_back();}
}int main()
{int i, j;cin >> n;string command1, command2;for(i = 0; i < n; i++){v[i].clear();v[i].push_back(i);rec[i] = i;}while(cin >> command1 && command1 != "quit"){if(command1 == "move"){cin >> i >> command2 >> j;if(rec[i] == rec[j]) continue;clear(i);v[rec[i]].pop_back();  if(command2 == "onto")                        //move a onto b:把木块a、b上的木块放回各自的原位,再把a放到b上;{//VEC temp;clear(j);v[rec[j]].push_back(i);rec[i] = rec[j];}else if(command2 == "over")                   //move a over b:把a上的木块放回各自的原位,再把a放到含b的堆上;{v[rec[j]].push_back(i);  rec[i] = rec[j];  }      }else if(command1 == "pile"){cin >> i >> command2 >> j;if (rec[i] == rec[j]) continue;  if(command2 == "onto")                        //pile a onto b:把b上的木块放回各自的原位,再把a连同a上的木块移到b上;{clear(j);VEC pos1 = Find(v[rec[i]], i), pos2 = Find(v[rec[j]], j);int tmp[25], cnt = 0;  for (VEC tn1 = v[rec[i]].end() - 1; tn1 >= pos1; tn1--)  //end():返回指向容器最后一个元素的迭代器 {tmp[cnt++] = *tn1;       //tmp存储顶层数字 v[rec[i]].erase(tn1);    //删除顶层数字 rec[*tn1] = rec[j];      //把删除的数(应该放到b上去)的Rec改成等于b所在的列 }  for (int q = 0; q < cnt / 2; q++)  // tmp中存储的数倒置 {int t = tmp[q]; tmp[q] = tmp[cnt - q - 1];tmp[cnt - q - 1] = t;} v[rec[j]].insert(pos2 + 1, tmp, tmp + cnt);              //在pos2+1的位置前面插入tmp[0]~tmp[cnt] //vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a; } else if(command2 == "over")                   //pile a over b:把a连同a上木块移到含b的堆上。{VEC pos1 = Find(v[rec[i]], i);  int tmp[25], cnt = 0;  for (VEC tn1 = v[rec[i]].end() - 1; tn1 >= pos1; tn1--) {tmp[cnt++] = *tn1;v[rec[i]].erase(tn1);rec[*tn1] = rec[j]; }  for (int q = 0; q < cnt / 2; q++) {int t = tmp[q]; tmp[q] = tmp[cnt - q - 1];tmp[cnt - q - 1] = t;} v[rec[j]].insert(v[rec[j]].end(), tmp, tmp + cnt);  }}}check();return 0;
}

Uva 101 the block problem 木块问题(算法竞赛经典入门)STL vector相关推荐

  1. 1-4 鸡兔同笼(算法竞赛经典入门)

    这个属于初级阶段传递给初学者的一个思想,那就是计算机是不可以计算方程式的,需要你具体的告诉它每一步需要做什么. 源码如下: #include<iostream> #include<b ...

  2. 韩信点兵(hanxin)--算法竞赛经典习题2-2:相传韩信才智过人,从不清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,他每次只要掠一眼队伍的排尾就知道总数(C++实现)

    韩信点兵(hanxin)–算法竞赛经典习题2-2:相传韩信才智过人,从不清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,他每次只要掠一眼队伍的排尾就知道总数. (C++实现 ...

  3. 算法竞赛从入门到进阶pdf_好书送不停 | 算法竞赛入门到进阶

    本书内容: 本书是算法竞赛的入门和进阶教材,包括算法思路.模板代码.知识体系.赛事相关等内容.本书把竞赛常用的知识点和竞赛题结合起来,讲解清晰.透彻,帮助初学者建立自信心,快速从实际问题入手,模仿经典 ...

  4. 算法竞赛从入门到进阶pdf_ACMICPC/CCPC算法竞赛入门建议

    繁花落尽,我心中仍有花落的声音,一朵,一朵,在无人的山间轻轻飘落. 欢迎喜欢 CodeForces,Atcoder,牛客,leetcode,Codechef 小伙伴们一起来van呀~ 交流群:1104 ...

  5. uva 101 The Blocks Problem

    1.     move a onto b在將a搬到b上之前,先將a和b上的積木放回原來的位置(例如:1就放回1的最開始位罝) 2. move a over b在將a搬到b所在的那堆積木之上之前,先將a ...

  6. UVA - 101:The Blocks Problem

    原本以为是一道很简单的模拟题,结果写了一个小时...很长时间不碰算法题,的确手感差很多.不过我觉得随着刷题慢慢多起来应该会好的. 题目的意思也有点含糊,需要自己去猜,大概意思就是槽里有一堆木头,每个槽 ...

  7. 【算法竞赛从入门到精通】【基础算法】

    基础算法 贪心法的基本思想 如何判断一个题目能用贪心法? 常见问题 最少硬币问题 活动安排问题(区间调度问题) 区间覆盖问题 最优装载问题 多机调度问题 Huffman编码 [poj 1521&quo ...

  8. 算法竞赛从入门到进阶pdf_【算法趣谈】线段树 从入门到进阶

        前言:这是一篇笔者两年前所写的博客.如今,在线段树在脑海中即将遗忘之际,这两年前留下的文章,终于将其再次唤醒.这篇文章对于线段树的理解虽谈不上绝对深刻,但是也能详细且简明地解释其流程.因而也收 ...

  9. 【算法竞赛练习题入门】在进行了多组输入 之后 再多组输出执行结果

    题目链接: 解题思路: 多组输入可以通过一个二维数组完成, 在输入完毕后, 然后在接下来的循环中分别调用二维数组中的元素,即二维数组中的每一行数组 在二维数组中的其中一行数组进行指针遍历操作时, 要先 ...

最新文章

  1. [WebApp开发]基础教程-Google官方文档-第四篇
  2. html怎么设置页面自适应屏幕大小,网页设计设置页面自适应屏幕宽度
  3. 三次握手和四次挥手之间的关系
  4. Testbench编写
  5. php imagick 缩略图,PHP利用imagick生成组合缩略图,imagick缩略图_PHP教程
  6. 二总线芯片RF601
  7. win10系统迁移后系统重装_win10系统迁移超简单!详细步骤解析
  8. matlab求广义逆及线性方程组的解
  9. php 中国地图编辑,科学网—如何正确绘制中国示意性地图?编辑给您提建议 - 科学出版社的博文...
  10. python中使用ffmpeg合并音频与视频_FFMpeg无损合并视频的多种方法
  11. 每周开源项目推荐计划
  12. 多元线性回归算法预测房价——Excel、jupyter+sklearn
  13. 计算机不接受跨专业考研,2016跨专业考研需谨慎的专业解读:计算机
  14. top命令怎么看?top命令详解
  15. SIMCOM最近推出4G+MIFI功能模块
  16. 微信小程序 评论input 弹出框
  17. (阿里offer)春招知识点总结1:java基础+集合+并发+jvm+ssm
  18. 把思科端口速率改为不协商_端口汇聚—TRUNK技术介绍
  19. 实验检测编译过程中的链接作用
  20. mac备忘录同步android,IOS技巧心得 篇五:iOS备忘录,可实现全平台实时同步,iPhone ipad PC...

热门文章

  1. cocos-lua中播放音乐音效
  2. PyTorch深度学习——梯度下降算法
  3. 中小型his系统维护
  4. kali 2020 VMware 15.5.1 启动时出错 before you can run vmware, several modules must be complied and……
  5. iBeacon系列:三、iBeacon能否精确室内定位等10个技术问题
  6. 2018考研计算机408经验详谈
  7. Linux防火墙策略管理
  8. 2022真无线蓝牙耳机推荐:618性价比超高的蓝牙耳机品牌
  9. python3操作sqite3删除数据表字段
  10. Java中CAS操作