# UVa 101 - The Blocks Problem
---
# 題目大意
有n個物品及n個區塊,區塊及物品的編號從0至n-1,一開始物品i在區塊i,接著會有4種指令:
move a onto b:把a和b上方的物品都歸回到原本位置,再把a疊到b上方。
move a over b:把a上方的物品都歸回到原本位置,再把a疊到b所在區塊的最上方。
pile a onto b:把b上方的物品都歸回到原本位置,再把a及它上面的物品都疊到b上方。
pile a over b:把a及上方的物品都疊到b所在區塊的最上方。
如果a和b都在同一區塊,則指令無效。最後指令是quit時,列印每個區塊的物品(按順序)。
原本位置的意思是:物品i則是區塊i的最下面
---
# 題解
用deque模擬指令,然後有多筆輸入要記得初始化
---
```=C++
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define pf push_front
#define ft first
#define sec second
#define pr pair<int,int>
#define ISCC ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
int t ,n ,m ,x ,y ,pos[30];
string s1 ,s2;
deque<int> a[30];
inline void ini(int p ,int v)
{
for(auto i=a[p].rbegin() ;(*i)!=v ;i++)
{
a[*i].pf(*i); pos[*i] = *i;
a[p].pop_back();
}
}
inline void pil(int p ,int v ,int des)
{
auto k = a[p].begin();
while((*k)!=v && k!=a[p].end()) k++;
for(auto i=k ;i!=a[p].end() ;i++)
{
a[des].pb(*i);
pos[*i] = des;
}
a[p].erase(k ,a[p].end());
}
int main()
{
while(cin >> n)
{
for(int i=0 ;i<n ;i++) a[i].clear() ,a[i].pf(i) ,pos[i]=i;
while(cin >> s1 && s1 != "quit")
{
cin >> x >> s2 >> y;
if(pos[x]==pos[y]) continue;
if(s1 == "move")
{
if(s2 == "onto" && a[pos[y]].back() != y) ini(pos[y] ,y);
if(a[pos[x]].back() != x) ini(pos[x] ,x);
a[pos[y]].pb(x); a[pos[x]].pop_back(); pos[x] = pos[y];
}
else
{
if(s2 == "onto" && a[pos[y]].back() != y) ini(pos[y] ,y);
pil(pos[x] ,x ,pos[y]);
}
}
for(int i=0 ;i<n ;i++ ,cout<<'\n')
{
cout << i << ":";
for(auto v:a[i]) cout << ' ' << v;
}
}
return 0;
}
```