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