首页 > 代码库 > The Blocks Problem UVA 101

The Blocks Problem UVA 101

说说:

其实这道题并不是很难,只是较为繁琐而已。首先,题意大概是这样的,开始的时候有若干个带有编号的盒子。然后总共有四种操作的方式:move a ontob,先将编号为a和b之上的盒子都返回初始位置,然后将a放在b上。move a over b 将a上的盒子返回初始位置,然后将a放在b所在的盒子堆上。pilea 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 ;
}


The Blocks Problem UVA 101