看不懂题目是硬伤,直到讲题知道意思后才勉强做出。。
//1.move a onto b,把a和b上面的方块都放回原来位置,然后把a放到b上面;
//2.move a over b,把a上面的放回原处,然后把a放在b所在的方块堆的上面;
//3.pile a onto b,把b上面的放回原来位置,然后把a和a上面的方块整体放到b上面;
//4.pile a over b,把a和a上面的方块整体放到b所在堆的上面。
//move 和 onto 后面是归位,判断后再移动
所以不用分四种讨论,可以和在一起
注意resize的用法
#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> arr[30];
void find(int a, int&p, int&h)
{
for(p = 0; p < n; p++)
for(h = 0; h < arr[p].size(); h++)
if(arr[p][h] == a)
return;
}
void guiwei(int p, int h)
{
for(int i = h+1; i < arr[p].size(); i++)
{
int a = arr[p][i];
arr[a].push_back(a);
}
arr[p].resize(h+1);//resize是保留下标0~h;后面的清空
// cout<<1<<endl;
}
void yidong(int pa, int ha, int pb)
{
for(int i = ha; i < arr[pa].size(); i++)
arr[pb].push_back(arr[pa][i]);
arr[pa].resize(ha);
// cout<<1<<endl;
}
int main()
{
while(scanf("%d", &n) != EOF)
{
int a, b;
string s1, s2;
for(int i = 0; i < n; i++)
arr[i].push_back(i);
while(cin >> s1)
{
if(s1 == "quit")
break;
cin >> a >> s2 >> b;
int pa, pb, ha, hb;
find(a, pa, ha);
find(b, pb, hb);
if(pa == pb)
continue;
if(s1 == "move")
guiwei(pa, ha);
if(s2 == "onto")
guiwei(pb, hb);
yidong(pa, ha, pb);
}
for(int i = 0; i < n; i++)
{
printf("%d:", i);
for(int j = 0; j < arr[i].size(); j++)
printf(" %d", arr[i][j]);
printf("\n");
}
}
}