题目:https://vjudge.net/problem/UVA-101
模拟题,观察可以发现一些操作的共同点:
move操作都需要还原a上方的木块
onto操作都需要还原b上方的木块
经过这两步之后都可以看成将a和a上方的所有木块放到b所在位置的最上方
#include<cstdio>
#include<vector>
using namespace std;
vector<int> A[30];
int n;
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
A[i].clear();
for (int i = 0; i < n; i++)
A[i].push_back(i);
char s1[100], s2[100];
int a, b;
while (scanf("%s", s1))
{
if (s1[0] == 'q')
break;
scanf("%d %s %d", &a, s2, &b);
//非法情况
int pa = -1, pb = -2; //a,b的位置
int paa, pbb;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < A[i].size(); j++)
{
if (A[i][j] == a)
{
pa = i;
paa = j;
}
if (A[i][j] == b)
{
pb = i;
pbb = j;
}
}
if (pa == pb)
break;
}
if (pa == pb)
continue;
//move的情况下a上的木块归位
if (s1[0] == 'm')
{
vector<int>::iterator it = A[pa].end();
for (int j = paa + 1; j < A[pa].size(); j++)
{
it--;
int t = A[pa][j];
A[t].push_back(t);
}
A[pa].erase(it, A[pa].end());
}
//onto的情况下b上的木块归位
if (s2[0] == 'o' && s2[1] == 'n')
{
vector<int>::iterator it = A[pb].end();
for (int j = pbb + 1; j < A[pb].size(); j++)
{
it--;
int t = A[pb][j];
A[t].push_back(t);
}
A[pb].erase(it, A[pb].end());
}
//将a和a上的东西移到b上
for (int k = paa; k < A[pa].size(); k++)
A[pb].push_back(A[pa][k]);
int k = 0;
vector<int>::iterator it;
for (it = A[pa].begin(); k < paa; k++)
{
it++;
}
A[pa].erase(it, A[pa].end());
}
//打印结果
for (int i = 0; i < n; i++)
{
printf("%d:", i);
for (int j = 0; j < A[i].size(); j++)
printf(" %d", A[i][j]);
printf("\n");
}
return 0;
}