The Block Problem, id:101

来源:互联网 发布:miyavi知乎 编辑:程序博客网 时间:2024/04/30 06:00

分析:

可以用C++的STL中的vector来表示每个木块堆。然后用一个数组来存储vector。具体代码如下:

#include <iostream>#include <cstdio>#include <vector>#include <string>using namespace std;vector<int> block_vec[25];int block_find(int a, int & h, int n) {    int pile ;    for(pile = 0; pile < n; pile++)        for(h = 0; h < block_vec[pile].size(); h++)            if(block_vec[pile][h] == a)                return pile;}void clear_h(int a_vec, int ha) {    for(int i = ha + 1; i < block_vec[a_vec].size(); i++) {        int x = block_vec[a_vec][i];        block_vec[x].push_back(x);    }    block_vec[a_vec].resize(ha + 1);}void move_block_vec(int va, int vb, int ha) {    for(int i = ha; i < block_vec[va].size(); i++) {        int x = block_vec[va][i];        block_vec[vb].push_back(x);    }    block_vec[va].resize(ha);}int main(){    string cmd1, cmd2;    int n, a, b;    scanf("%d", &n);    for(int i = 0; i < n; i++)        block_vec[i].push_back(i);    while(cin >> cmd1 >> a >>  cmd2 >> b ) {        int a_vec, b_vec, ha, hb;        a_vec = block_find(a, ha, n);        b_vec = block_find(b, hb, n);        if(a_vec == b_vec)  continue;        if(cmd1 == "move")  clear_h(a_vec, ha);        if(cmd2 == "onto")    clear_h(b_vec, hb);        if(cmd1 == "quit")  break;        move_block_vec(a_vec, b_vec, ha);    }    for(int i = 0; i < n; i++) {        printf("%d:", i);        for(int j = 0; j < block_vec[i].size(); j++)            printf(" %d", block_vec[i][j]);        printf("\n");    }    return 0;}

运行结果如下:


0 0
原创粉丝点击