zoukankan      html  css  js  c++  java
  • 入门经典第五章例题5-2

    几乎所有的操作都是围绕vector的,用到了push_backsize等常用的方法,也用到了resize这样很少用到的方法。题目挺复杂,如果设计不好会有很多重复的代码,书中写到最好的方法是提取指令之间的共同点以减少重复代码。

    resize方法对于参数值的处理,如果大于当前的size则会向vector中插入新的对象并且初始化,如果小于当前的size则会删除多余的对象。

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 30;
    int n;
    vector<int> pile[maxn];
    void clear_above(int p, int h) {
    	for (int i = h+1; i < pile[p].size(); ++i) {
    		int b = pile[p][i];
    		pile[b].push_back(b);
    	}
    	pile[p].resize(h+1);
    }
    void find_block(int a, int &p, int &h) {
    	for (p = 0; p < n; ++p) for (h = 0; h < pile[p].size(); ++h)
    		if (pile[p][h] == a) return;
    }
    void pile_onto(int p, int h, int p2) {
    	for (int i = h; i < pile[p].size(); ++i) 
    		pile[p2].push_back(pile[p][i]);
    	pile[p].resize(h);
    }
    int main() {
    	scanf("%d", &n);
    	for (int i = 0; i < n; ++i) pile[i].push_back(i);
    	int a, b;
    	string s1, s2;
    	while (cin >> s1 >> a >> s2 >> b) {
    		int pa, pb, ha, hb;
    		find_block(a, pa, ha);
    		find_block(b, pb, hb);
    		if (pa == pb) continue;
    		if (s2 == "onto") clear_above(pb, hb);
    		if (s1 == "move") clear_above(pa, ha);
    		pile_onto(pa, ha, pb);
    	}
    	for (int i = 0; i < n; ++i) {
    		printf("%d:", i);
    		for (int j = 0; j < pile[i].size(); ++j) printf(" %d", pile[i][j]);
    		printf("
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    大数运算
    混合背包问题
    多重背包问题(二进制优化)
    完全背包
    01背包问题
    树状数组
    构建之法阅读笔记04
    第一次冲刺个人总结07
    构建之法阅读笔记03
    第一次冲刺个人总结06
  • 原文地址:https://www.cnblogs.com/jeffy-chang/p/7040941.html
Copyright © 2011-2022 走看看