1. 题目:给你n个方块,有四种操作:
  2.  
  3. .move a onto b,把ab上面的方块都放回原来位置,然后把a放到b上面;
  4.  
  5. .move a over b,把a上面的放回原处,然后把a放在b所在的方块堆的上面;
  6.  
  7. .pile a onto b,把b上面的放回原来位置,然后把aa上面的方块整体放到b上面;
  8.  
  9. .pile a over b,把aa上面的方块整体放到b所在堆的上面。
  10.  
  11. 分析:模拟,数据结构。观察操作,如果是move就是先把a上面的还原,如果是onto就是先把b上面的还原。
  12.  
  13. 然后,就是移动一堆到另一堆的上面(单个也认为是一堆)。所以设置两个基础操作:
  14.  
  15. .将a上面的还原init_place(a);
  16.  
  17. .将a和上面的(可以没有上面的)放到b上面pile_a_to_b(a,b)。
  18.  
  19. 那么上述的四组操作就变成下面了:
  20.  
  21. .move a onto binit_place(a);init_place(b);pile_a_to_b(a,b);
  22.  
  23. .move a over binit_place(a);pile_a_to_b(a,b);
  24.  
  25. .pile a onto binit_place(b);pile_a_to_b(a,b);
  26.  
  27. .pile a over bpile_a_to_b(a,b)。
  28.  
  29. 利用两个操作轻松解决。具体实现时设置一个place数组记录每个编号的方块对应的堆。
  30.  
  31. 注意:如果ab已经在一堆中就不要操作,此时认为不用移动,否则会WA

~~~~~~~~~~~~~抄对了.~~~~~~~然而并不懂 .

  1. #include<cstdio>
  2. #include<string>
  3. #include<vector> //该头文件中的 vector 是一个不定长的数组
  4. #include<iostream>
  5. using namespace std;
  6. const int maxn=;
  7. int n;
  8. vector<int>pile[maxn];
  9. void find_block(int a,int& p,int& h)
  10. {
  11. for(p=;p<n;p++)
  12. {
  13. for(h=;h<pile[p].size();h++) //从0 开始 遍历 看其是否 有等0之时 .
  14. if(pile[p][h]==a)
  15. return;
  16. }
  17. }
  18. void clear_above(int p,int h)
  19. {
  20. for(int i=h+;i<pile[p].size();i++)
  21. {
  22. int b=pile[p][i];
  23. pile[b].push_back(b);
  24. }
  25. pile[p].resize(h+);
  26. }
  27. void pile_onto(int p,int h,int p2)
  28. {
  29. for(int i=h;i<pile[p].size();i++)
  30. pile[p2].push_back(pile[p][i]);
  31. pile[p].resize(h);
  32. }
  33. void print()
  34. {
  35. for(int i=;i<n;i++)
  36. {
  37. printf("%d:",i);
  38. for(int j=;j<pile[i].size();j++)
  39. printf(" %d",pile[i][j]);
  40. printf("\n");
  41. }
  42. }
  43. int main()
  44. {
  45. int a,b;
  46. scanf("%d",&n);
  47. string s1,s2;
  48. for(int i=;i<n;i++)
  49. pile[i].push_back(i);
  50. while(cin>>s1>>a>>s2>>b)
  51. {
  52. int pa,pb,ha,hb;
  53. find_block(a,pa,ha);
  54. find_block(b,pb,hb);
  55. if(pa=pb)
  56. continue;
  57. if(s2=="onto")
  58. clear_above(pb,hb);
  59. if(s1=="move")
  60. clear_above(pa,ha);
  61. pile_onto(pa,ha,pb);
  62. }
  63. print();
  64. return ;
  65. }

UVa 101 - The Blocks Problem STL的更多相关文章

  1. UVa 101 The Blocks Problem Vector基本操作

    UVa 101 The Blocks Problem 一道纯模拟题 The Problem The problem is to parse a series of commands that inst ...

  2. UVa 101 - The Blocks Problem(积木问题,指令操作)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  3. UVa 101 The Blocks Problem

    题意:给出从左到右放置的n块木块(从0开始编号),再给出四种操作,再给出相应的操作,输出操作结束后每一堆木块的情况. 学习的紫书,因为每一堆的木块数是在发生变化的,所以用vector. 然后就是模拟几 ...

  4. Uva 101 -- the block problem

    Uva 101 the block problem 题目大意: 输入n,得到编号为0~n-1的木块,分别摆放在顺序排列编号为0~n-1的位置.现对这些木块进行操作,操作分为四种. 1.move a o ...

  5. uvaoj 101 - The Blocks Problem(vector应用+技巧)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=835&page= ...

  6. 木块问题(The Blocks Problem,Uva 101)

    不定长数组:vector vector就是一个不定长数组.不仅如此,它把一些常用操作“封装”在了vector类型内部. 例如,若a是一个vector,可以用a.size( )读取它的大小,a.resi ...

  7. 【UVA - 101】The Blocks Problem(vector+模拟)

    The Blocks Problem Descriptions:(英语就不说了,直接上翻译吧) 初始时从左到右有n个木块,编号为0~n-1,要求实现下列四种操作: move a onto b: 把a和 ...

  8. POJ 1208 The Blocks Problem

    The Blocks Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5397   Accepted: 231 ...

  9. 【暑假】[深入动态规划]UVa 1380 A Scheduling Problem

     UVa 1380 A Scheduling Problem 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41557 ...

随机推荐

  1. CF-697B Barnicle与691C Exponential notation

    无聊写两个题解吧,上午做比赛拉的,感触很多! B. Barnicle time limit per test 1 second memory limit per test 256 megabytes ...

  2. [HDU2136] Largest prime factor(素数筛)

    传送门 题意 给出若干个数n(n<=1000000),求每个n的最大质因子的排名. 质数的排名:如果素数p是第k小的素数,那么p的排名就是k. 思路 乍一看不知道怎么搞. 其实可以想想我们怎么筛 ...

  3. 【NOIP2017练习】鏖战字符串(斜率优化DP)

    题意: 在决胜局中,Abwad决定和nbc鏖战字符串,比的是谁能更快地将一个“量子态的字符串”删除.“量子态的字符串”的每个字符都有一个删除难度dif[i].“量子态的字符串”非常顽固,只能先分割成若 ...

  4. Ubuntu 16.04安装Ubuntu After Install工具实现常用软件批量安装

    这个软件集成了常用且好用的软件,且只需要选择需要的软件之后自动安装好,不需要额外设置. 安装: sudo add-apt-repository ppa:thefanclub/ubuntu-after- ...

  5. Servlet发送邮件

    以下内容引用自http://wiki.jikexueyuan.com/project/servlet/sending-email.html: 使用Servlet发送一封电子邮件是非常简单的,但是开始之 ...

  6. Java随机生成常用汉字验证码

    原文:http://www.open-open.com/code/view/1422514803970 import java.awt.Color; import java.awt.Font; imp ...

  7. symfony 参考

    多语言存数据库 http://blog.elendev.com/development/php/symfony/use-a-database-as-translation-provider-in-sy ...

  8. poj 2318 TOYS &amp; poj 2398 Toy Storage (叉积)

    链接:poj 2318 题意:有一个矩形盒子,盒子里有一些木块线段.而且这些线段坐标是依照顺序给出的. 有n条线段,把盒子分层了n+1个区域,然后有m个玩具.这m个玩具的坐标是已知的,问最后每一个区域 ...

  9. vux 实现多栏滚动

    1.PopupPicker 组件 <!-- vux-ui --> <template> <div> <!-- 标题栏 --> <x-header ...

  10. 浅析分布式数据库中间件DDM

    前言 DDM是什么?这是华为云Paas推出的分布式数据库中间件,DDM(Distributed Database Middleware)是一个实现了Mysql协议栈的服务器,前端用户可以把它看做一个数 ...