UVa OJ The Blocks Problem 木块问题 101

UVa OJ The Blocks Problem 木块问题 101

题目大意:


1, move a onto b

把a移到b上,在移之前,把a,b上的积木都放回原处;


2,move a over b

把a移到b上,在移之前,把a上的积木都放回原处;


3,pile a onto b

把a及a上面的所有木块(保持原有顺序)移到b上,在移之前,b上的积木先放回原处;


4,pile a over b

把a及a上的所有木块(保持原有顺序)移到b上。


题目本身没有什么难度,只涉及到线性表的操作而已,只是在输出格式时需要注意:

当该堆没有实际的木块时,冒号“:”后不需要输出一个空格。


#include<iostream>
#include<cstring>
#include<cstdlib>
#define MAXN 30

using namespace std;

int pos[MAXN];
int blk[MAXN][MAXN];
int blkNum[MAXN];
int n;

int getPos(int t){
	int tp;
	int w=pos[t];
	for(int i=0;i<blkNum[w];i++){
		if(blk[w][i]==t){
			tp=i;
			break;
		}
	}
	return tp;
}

void reBlk(int t){
	int tp=getPos(t);
	int w=pos[t];
	for(int i=tp+1;i<blkNum[w];i++){
		int tmp=blk[w][i];
		blk[tmp][blkNum[tmp]++]=tmp;
		pos[tmp]=tmp;
	}
	blkNum[w]=tp+1;
}

void opBlk(int a,int b){
	int tpa=getPos(a);
	int tpb=getPos(b);
	int wa=pos[a];
	int wb=pos[b];
	for(int i=tpa;i<blkNum[wa];i++){
		blk[wb][blkNum[wb]++]=blk[wa][i];
		pos[blk[wa][i]]=wb;
	}
	blkNum[wa]=tpa;
}

int main(){
	#ifdef LOCAL
	freopen("101_input.txt","r",stdin);
	freopen("101_output.txt","w",stdout);
	#endif
	char op1[10],op2[10];
	int a,b;
	while(~scanf("%d",&n)){
		for(int i=0;i<n;i++){
			pos[i]=i;
			blkNum[i]=1;
			blk[i][0]=i;
		}
		while(~scanf("%s",op1)&&strcmp(op1,"quit")!=0){
			scanf("%d%s%d",&a,op2,&b);
			if(a==b||pos[a]==pos[b])continue;
			if(strcmp(op1,"move")==0)
				reBlk(a);		
			if(strcmp(op2,"onto")==0)
				reBlk(b);	
			opBlk(a,b);			
		}
		for(int i=0;i<n;i++){
			cout<<i<<":";
			for(int j=0;j<blkNum[i];j++){
				cout<<" "<<blk[i][j];
			}
			cout<<endl;
		}
	}	
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值