模拟题,根据题目描述的内容直接写程序就可以。
需要注意的是非法输入的情况:对于a==b或是a和b在同一堆的输入命令直接忽略。
#include <set>
#include <map>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <sstream>
#include <cstdio>
#include <cmath>
#include <limits>
#include <utility>
#ifndef ONLINE_JUDGE
#include <fstream>
std::ifstream cin("in.txt");
std::ofstream cout("out.txt");
// std::ofstream cout(stdout);
#else
#include <iostream>
#endif
typedef long long llong;
typedef unsigned long long ullong;
typedef long double ldouble;
using namespace std;
vector<vector<int> > blocks;
vector<pair<int,int> > position;
void returnBlocksOnTopOf(int block)
{
int nStack = position[block].first;
int nOffset = position[block].second;
for(int i = nOffset + 1; i < blocks[nStack].size(); ++i)
{
int x = blocks[nStack][i];
blocks[x].push_back(x);
position[x] = make_pair(x, 0);
}
blocks[nStack].resize(nOffset + 1);
}
void mergeStack(int source, int target)
{
int nSourceStack = position[source].first;
int nSourceOffset = position[source].second;
int nTargetStack = position[target].first;
int nTargetOffset = position[target].second;
if(nSourceStack != nTargetStack)
{
for(int i = nSourceOffset; i < blocks[nSourceStack].size(); ++i)
{
int x = blocks[nSourceStack][i];
position[x] = make_pair(nTargetStack, blocks[nTargetStack].size());
blocks[nTargetStack].push_back(x);
}
blocks[nSourceStack].resize(nSourceOffset);
}
}
int main(int argc, char* argv[])
{
int nBlocks;
cin>> nBlocks;
blocks.resize(nBlocks);
position.resize(nBlocks);
for(int i = 0; i < nBlocks; ++i)
{
blocks[i].push_back(i);
position[i] = make_pair(i, 0);
}
for(;;)
{
string command, type;
int source, target;
cin>> command;
if(command[0] == 'q')
break;
cin>> source>> type>> target;
if(source == target || position[source].first == position[target].first)
continue;
switch(type[1])
{
case 'n': // onto
returnBlocksOnTopOf(target);
break;
case 'v': // over
break;
}
switch(command[0])
{
case 'm': // move
returnBlocksOnTopOf(source);
break;
case 'p': // pile
break;
}
mergeStack(source, target);
}
for(int i = 0; i < nBlocks; ++i)
{
cout<< i<< ":";
if(blocks[i].size() > 0)
{
for(int j = 0; j < blocks[i].size(); ++j)
cout<< " "<< blocks[i][j];
}
cout<< "/n";
}
return 0;
}