uva 101 The Blocks Problem

来源:互联网 发布:c语言所有函数 编辑:程序博客网 时间:2024/05/16 01:32
#include <cstdio>#include <string>#include <vector>#include <iostream>using namespace std;const int maxn = 30;int n;vector<int> pile[maxn]; //每个pile[i]是一个vector//找木块a所在的pile 和height,以引用的形式返回调用者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;}//把第p堆高度为h的木块上方的所有木块移回原位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); //把木块b放回原位    }    pile[p].resize(h+1); //pile 只应保留下标0~h 的元素}//把第p堆高度为h及其上方的木块整体移动到p2 堆的顶部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);}void print(){    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("\n");    }}int main(){    int a, b;    cin >> n;    string s1, s2;    for(int i = 0; i < n; i++) pile[i].push_back(i);    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);    }    print();    return 0;}
0 0
原创粉丝点击