• uva 101 by sixleaves


    这是一道很好的模拟题,用vector<int> p[maxn],建立模型,映射为maxn个堆。主要要掌握vector模拟堆操作的简单方法。
    接下来得思路是自顶向下的方式,逐步完善程序。首先根据提议列出下表。
    1.move a onto b
    clear_above(a) && clear_above(b);
    insert a above b;

    2.move a over b
    clear(a)
    insert a above bs

    3.pile a onto b
    clear(b)
    insert as above b

    4.pile a over b
    insert as above bs

    观察可以提取出move的话必有clear_above(a)、onto必有clear_above(b).
    而insert 动作不管b是在p[b]的顶部还是外部。都是p[b].push_back(a或a以上的木块)
    所以可以抽取成pile_into(pa, ha, pb);

    考虑完这些,开始写框架。如下
     1 
     2 #include <cstdio>
     3 #include <iostream>
     4 #include <string>
     5 #include <vector>
     6 using namespace std;
     7 
     8 const int maxn = 64;
     9 int n;
    10 vector<int> a[maxn];
    11 int find_block(int a, int& h);
    12 void clear_above(int p, int h);
    13 void pile_into(int pa, int ha, int pb);
    14 void print();
    15 int main() {
    16 
    17     
    18     
    19     string s1, s2;
    20     scanf("%d", &n);
    21     for (int i = 0; i < n ; i++) {
    22         a[i].push_back(i);
    23     }
    24     
    25     while (cin >> s1, s1 != "quit") {
    26         int ba,bb;
    27         cin >> ba >> s2 >> bb;
    28         int ha = 0,hb = 0;
    29         int pa = find_block(ba, ha);
    30         int pb = find_block(bb, hb);
    31         if (pa == pb) continue;
    32         
    33         if (s1 == "move") clear_above(pa, ha);
    34         if (s2 == "onto") clear_above(pb, hb);
    35         pile_into(pa, ha, pb);
    36     }
    37     
    38     print();
    39     return 0;
    40 }
     
    接下来,完成程序其它部分,按照框架的意思,逐步完善。如下
     1 void print() {
     2     
     3     for (int i = 0; i < n; i++) {
     4         printf("%d:",i);
     5         for (int h = 0; h < a[i].size(); h++) {
     6             printf(" %d", a[i][h]);
     7         }
     8         printf(" ");
     9     }
    10 }
    11 
    12 int find_block(int ba, int& h) { 
    13     
    14     for (int i = 0; i < n; i++) {
    15         
    16         int vec_size = a[i].size();
    17         for (h = 0; h < vec_size; h++) {
    18             if (ba == a[i][h]) return i;
    19         }
    20         
    21     }
    22     return -1;
    23 }
    24 
    25 void clear_above(int p, int h) {
    26     int vec_size = a[p].size();
    27     for (int i = h + 1; i < vec_size; i++) {
    28         
    29         int b = a[p][i];
    30         a[b].push_back(b);
    31         
    32     }
    33     a[p].resize(h + 1);
    34 }
    35 
    36 void pile_into(int pa, int ha, int pb) {
    37     
    38     int vec_size = a[pa].size();
    39     
    40     for (int i = ha; i < vec_size; i++) {
    41         a[pb].push_back(a[pa][i]);
    42     }
    43     a[pa].resize(ha);
    44 }
  • 相关阅读:
    webpack配置之代码优化
    react组件生命周期
    javascript记住用户名和登录密码
    ajax异步请求原理和过程
    深入理解ajax系列第五篇——进度事件
    ajax多次请求,只执行最后一次的方法
    CentOS6.8下MySQL MHA架构搭建笔记
    HTTP状态码
    什么是 Redis 事务?原理是什么?
    Redis 通讯协议是什么?有什么特点?
  • 原文地址:https://www.cnblogs.com/objectc/p/4553501.html
Copyright © 2020-2023  润新知