说说:
其实这道题并不是很难,只是较为繁琐而已。首先,题意大概是这样的,开始的时候有若干个带有编号的盒子。然后总共有四种操作的方式: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所在的堆的序号以及它们在堆中的位置,然后按部就班地按照指令的意思操作即可。开始以为细节方面有调整好久,没想到一次就AC了,好开心=v=
源代码:
#include <stdio.h>
#include <string.h>
#define MAXN 30
int stack[MAXN][MAXN];
char stack_num[MAXN];
void back_initial(int,int);//将某盒子上的盒子全部返回初始位置
int main(){
int n,a,b,i,j,astack,bstack,apos,bpos;//astack为a所在堆的编号,apos为a在该堆的位置
char s1[5],s2[5];
// freopen("data","r",stdin);
scanf("%d",&n);
memset(stack_num,1,sizeof(stack_num));
for(i=0;i<n;i++)
stack[i][0]=i;
while(scanf("%s",s1)&&strcmp(s1,"quit")!=0){
scanf("%d%s%d",&a,s2,&b);
if(a==b)
continue;
for(i=0;i<n;i++)
for(j=0;j<stack_num[i];j++)
if(stack[i][j]==a){//找到a所在的堆的编号及a在堆中的位置
astack=i;
apos=j;
}
else if(stack[i][j]==b){
bstack=i;
bpos=j;
}
if(astack==bstack)
continue;
/*按四种方式操作即可*/
if(strcmp(s1,"move")==0&&strcmp(s2,"onto")==0){
back_initial(bstack,bpos);
back_initial(astack,apos);
stack[bstack][bpos+1]=a;
stack_num[bstack]++;
stack_num[astack]--;
}
else if(strcmp(s1,"move")==0&&strcmp(s2,"over")==0){
back_initial(astack,apos);
stack[bstack][stack_num[bstack]]=a;
stack_num[bstack]++;
stack_num[astack]--;
}
else if(strcmp(s1,"pile")==0&&strcmp(s2,"onto")==0){
back_initial(bstack,bpos);
for(i=apos;i<stack_num[astack];i++)
stack[bstack][stack_num[bstack]++]=stack[astack][i];
stack_num[astack]=apos;
}
else {
for(i=apos;i<stack_num[astack];i++)
stack[bstack][stack_num[bstack]++]=stack[astack][i];
stack_num[astack]=apos;
}
}
for(i=0;i<n;i++){
printf("%d:",i);
for(j=0;j<stack_num[i];j++)
printf(" %d",stack[i][j]);
putchar('\n');
}
return 0;
}
void back_initial(int s,int pos){
int i;
for(i=stack_num[s]-1;i>pos;i--){
stack[stack[s][i]][stack_num[stack[s][i]]]=stack[s][i];
stack_num[s]--;
stack_num[stack[s][i]]++;
}
return ;
}原文地址:http://blog.csdn.net/u011915301/article/details/39119777