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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章