您的位置:首页 > 其它

UVa OJ The Blocks Problem 木块问题 101

2017-04-01 14:07 513 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: