分析:
可以用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;
}
运行结果如下: