说说:
其实这道题并不是很难,只是较为繁琐而已。首先,题意大概是这样的,开始的时候有若干个带有编号的盒子。然后总共有四种操作的方式: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