UVa 101 The Blocks Problem [模拟]

#Description
模拟
#Algorithm
模拟
学习Vector用
#Hint
HDU 也有这题 用这个代码会 PE
UVa 能AC
#Code

#include <iostream>
#include <vector>
using namespace std;
const int maxn = 25 + 9;
int n;
vector<int> p[maxn];
struct V
{
  int p, h;
  V(){}
  V(int p, int h):p(p), h(h){}
};
V findx(const int &a)
{
  for (int i = 0; i < n; i++)
    for (int j = 0; j < p[i].size(); j++)
      if (p[i][j] == a) return V(i, j);
}
void reset(V l)
{
  for (int i = p[l.p].size() - 1; i > l.h; i--)
  {
    int now = p[l.p][i];
    p[now].push_back(now);
    p[l.p].pop_back();
  }
}
void movex(V la, V lb)
{
  for (int i = la.h; i < p[la.p].size(); i++)
    p[lb.p].push_back(p[la.p][i]);
  p[la.p].resize(la.h);
}
int main()
{
  cin >> n;
  for (int i = 0; i < n; i++) p[i].push_back(i);
  for (;;)
  {
    string s[2];
    cin >> s[0];
    if (s[0] == "quit") break;
    int a, b;
    cin >> a >> s[1] >> b;
    V la = findx(a);
    V lb = findx(b);
    if (la.p == lb.p) continue;
    if (s[0] == "move" && s[1] == "onto")
    {
      reset(la);
      reset(lb);
      p[la.p].pop_back();
      p[lb.p].push_back(a);
    }else if (s[0] == "move" && s[1] == "over")
    {
      reset(la);
      p[la.p].pop_back();
      p[lb.p].push_back(a);
    }else if (s[0] == "pile" && s[1] == "onto")
    {
      reset(lb);
      movex(la, lb);
    }else movex(la, lb);
  }
  for (int i = 0; i < n; i++)
  {
    cout << i << ":";
    for (int j = 0; j < p[i].size(); j++)
      cout << " " << p[i][j];
    cout << endl;
  }
}

猜你喜欢

转载自blog.csdn.net/YYecust/article/details/50991197