题目大意:
按照4条指令搬运积木即可。
1、move a onto b
在將a搬到b上之前,先將a和b上的積木放回原來的位置(例如:1就放回1的最开始位罝)
2、move a over b
在將a搬到b所在的那堆积木上前,先將a上的积木放回原來的位罝(b所在的那堆不动)
3、pile a onto b
將a本身和其上的积木一起放到b上,在搬之前b上方的积木放回原位
4、pile a over b
將a本身和其上的积木一起搬到到b所在的那堆上
5、quit
结束命令,前四个动作中若a=b,或者a, b在同一堆中,该动作不合法,不做改变。
解题思路:
模拟题,分别写4个函数模拟这个过程即可
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
int len;
int stack;
}pos;
int num[30][30],len[30],n,a,b;
pos p[30];
char ch1[20],ch2[20];
void moveonto()
{
int i,j,x,y;
x=p[a].stack;y=p[a].len;
for(i=y+1;i<=len[x];i++)
{
num[num[x][i]][++len[num[x][i]]]=num[x][i];
p[num[x][i]].len=len[num[x][i]];
p[num[x][i]].stack=num[x][i];
}
num[p[b].stack][++len[p[b].stack]]=a;
p[a].len=len[p[b].stack];
p[a].stack=p[b].stack;
len[x]=y-1;
}
void moveover()
{
int i,j,x,y;
x=p[a].stack;y=p[a].len;
for(i=y+1;i<=len[x];i++)
{
num[num[x][i]][++len[num[x][i]]]=num[x][i];
p[num[x][i]].len=len[num[x][i]];
p[num[x][i]].stack=num[x][i];
}
num[p[b].stack][++len[p[b].stack]]=a;
p[a].len=len[p[b].stack];
p[a].stack=p[b].stack;
len[x]=y-1;
}
void pileover()
{
int i,j,x,y;
x=p[a].stack;y=p[a].len;
for(i=y;i<=len[x];i++)
{
num[p[b].stack][++len[p[b].stack]]=num[x][i];
p[num[x][i]].len=len[p[b].stack];
p[num[x][i]].stack=p[b].stack;
}
len[x]=y-1;
}
void pileonto()
{
int i,j,x,y;
x=p[b].stack;y=p[b].len;
for(i=y+1;i<=len[x];i++)
{
num[num[x][i]][++len[num[x][i]]]=num[x][i];
p[num[x][i]].len=len[num[x][i]];
p[num[x][i]].stack=num[x][i];
}
len[x]=y;
x=p[a].stack;y=p[a].len;
for(i=y;i<=len[x];i++)
{
num[p[b].stack][++len[p[b].stack]]=num[x][i];
p[num[x][i]].len=len[p[b].stack];
p[num[x][i]].stack=p[b].stack;
}
len[x]=y-1;
}
int main()
{
int i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
{
p[i].len=1;
p[i].stack=i;
len[i]=1;
num[i][1]=i;
}
while(scanf("%s",ch1)!=EOF&&(strcmp(ch1,"quit")))
{
scanf("%d%s%d",&a,ch2,&b);
if((!strcmp(ch1,"move"))&&(!strcmp(ch2,"onto")))
{
if(a==b||(p[a].stack==p[b].stack))
{
continue;
}
moveonto();
}
if((!strcmp(ch1,"move"))&&(!strcmp(ch2,"over")))
{
if(a==b||(p[a].stack==p[b].stack))
{
continue;
}
moveover();
}
if((!strcmp(ch1,"pile"))&&(!strcmp(ch2,"onto")))
{
if(a==b||(p[a].stack==p[b].stack))
{
continue;
}
pileonto();
}
if((!strcmp(ch1,"pile"))&&(!strcmp(ch2,"over")))
{
if(a==b||(p[a].stack==p[b].stack))
{
continue;
}
pileover();
}
}
for(i=0;i<n;i++)
{
printf("%d:",i);
for(j=1;j<=len[i];j++)
{
printf(" %d",num[i][j]);
}
printf("\n");
}
return 0;
}