这道题目有两个关键点:
第一个是如何知道当前某个元素的位置
第二个是将各种操作抽象出来
下面贴上代码
其实还是很简单的
//问题的关键在于,你如何知道某一块木块此时的位置,解决方式是用一个数组来保存当前此木块所在的位置 //操作步骤: //a放到b上 a,b上方全部归位 //a摞到b上,a上方归位,b不归位,直接放到b上 //a整体放到b上,a不归位,b归位,全部放到b上 //a整体摞倒b上,都不归位 #include<cstdio> #include<iostream> #include<string> #include<vector> using namespace std; const int maxn = 30; vector<int>pile[maxn]; int pos_now[maxn]; int num_block; //清除x上面的block void clear_above(int x) { int pos=pos_now[x],cnt,flag=0; for(int i=0;i<pile[pos].size();i++) { if(flag) { pile[pile[pos][i]].push_back(pile[pos][i]); pos_now[pile[pos][i]]=pile[pos][i]; } if(pile[pos][i]==x)//找到它了 { flag=1; cnt=i; } } pile[pos].resize(cnt+1); } //从a开始,直接放到b上 void pile_onto(int a,int b) { int pos_a=pos_now[a],pos_b=pos_now[b],flag=0,cnt; for(int i=0;i<pile[pos_a].size();i++) { if(pile[pos_a][i]==a) { flag=1; cnt=i; } if(flag) { pile[pos_b].push_back(pile[pos_a][i]); pos_now[pile[pos_a][i]]=pos_b; } } pile[pos_a].resize(cnt); } void initial(int n) { for(int i=0;i<num_block;i++) { pos_now[i]=i; pile[i].push_back(i); } } void print_ans() { for(int i=0;i<num_block;i++) { printf("%d:",i); for(int j=0;j<pile[i].size();j++) { printf(" %d",pile[i][j]); } printf("\n"); } } void print_pos() { for(int i=0;i<num_block;i++) { printf(" %d",pos_now[i]); } printf("\n\n"); } int main() { #ifdef local freopen("input.txt","r",stdin); #endif scanf("%d",&num_block); //printf("num_block=%d\n",num_block); initial(num_block); string comd1,comd2; int a,b; for(;;) { //print_pos(); //print_ans(); cin>>comd1; if(comd1=="quit") { print_ans(); return 0; } scanf("%d",&a); cin>>comd2; scanf("%d",&b); //cout<<comd1<<" "<<a<<" "<<comd2<<" "<<b<<endl; if(pos_now[a]==pos_now[b]) { continue;//忽略此命令 } if(comd1=="move") { clear_above(a); } if(comd2=="onto") { clear_above(b); } pile_onto(a,b); } return 0; }