source:
题意:有n个方块,四种操作:
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所在堆的上面。
求经过若干步操作之后方块的分布情况
思路:可以用两种子函数简化:
1.ret_place(a)函数:将a上面的方块放回原来的位置
2.pileto(a,b)函数:将a和a上面的方块整体移到b上面
另外关于vector的基本用法之前博文里总结过,见点击打开链接
代码如下:
#include<stdio.h>
#include<vector>
using namespace std;
int belong[26],n;
vector<int> seq[26];
void ret_place(int a)
{
int t=belong[a];
int i=seq[t].size();
while(seq[t][--i]!=a)
{
int temp=seq[t][i];
belong[temp]=temp;
seq[temp].push_back(temp);
seq[t].pop_back();
}
}
void pileto(int a,int b)
{
int t=belong[a];
int temp[26],j=0;
for(int i=seq[t].size()-1;seq[t][i]!=a;i--)
{
temp[j++]=seq[t][i];
seq[t].pop_back();
}
temp[j]=a;
seq[t].pop_back();
t=belong[b];
for(;j>=0;j--)
{
belong[temp[j]]=t;
seq[t].push_back(temp[j]);
}
}
int main()
{
char oper[8],type[8];
int a,b;
scanf("%d",&n);
for(int i=0;i<n;i++) belong[i]=i;
for(int i=0;i<n;i++)
{
seq[i].clear();
seq[i].push_back(i);
}
while(scanf("%s",oper) && oper[0]!='q')
{
scanf("%d %s %d",&a,type,&b);
if(a==b || belong[a]==belong[b]) continue;
if(oper[0]=='m')
if(type[1]=='n')
{
ret_place(a);
ret_place(b);
}
else ret_place(a);
else if(type[1]=='n') ret_place(b);
pileto(a,b);
}
for(int i=0;i<n;i++)
{
printf("%d:",i);
for(int j=0;j<seq[i].size();j++) printf(" %d",seq[i][j]);
printf("\n");
}
return 0;
}