分析:這道題蠻有意思的,雖然說很簡單,但是可以當做練手吧,鍛煉自己碼代碼的能力。
注意:當a和b相等的時候,判定這個輸入不合法,不做任何的操作。
#include<stdio.h>#include<string.h>#define MAXN 26int blocks[MAXN][MAXN];int n,order[MAXN],position[MAXN];void init(){ memset(blocks,-1,sizeof(blocks)); for(int i=0;i!=n;i++) { order[i]=0; blocks[i][order[i]]=i; position[i]=i; }}void returning_back(int x){ int pos=position[x]; for(int i=order[x]+1;blocks[pos][i]!=-1;i++) { blocks[blocks[pos][i]][0]=blocks[pos][i]; position[blocks[pos][i]]=blocks[pos][i]; order[blocks[pos][i]]=0; blocks[pos][i]=-1; }}void move_onto(int a,int b){ int pos_a=position[a]; int pos_b=position[b]; if(pos_a==pos_b) return; returning_back(a); returning_back(b); blocks[pos_a][order[a]]=-1; order[a]=order[b]+1; blocks[pos_b][order[a]]=a; position[a]=pos_b;}void move_over(int a,int b){ int pos_a=position[a]; int pos_b=position[b]; if(pos_a==pos_b) return; returning_back(a); int i; blocks[pos_a][order[a]]=-1; for(i=order[b]+1;blocks[pos_b][i]!=-1;i++); order[a]=i; blocks[pos_b][order[a]]=a; position[a]=pos_b;}void pile_onto(int a,int b){ int pos_a=position[a]; int pos_b=position[b]; if(pos_a==pos_b) return; returning_back(b); int i,j=order[b]; for(i=order[a];blocks[pos_a][i]!=-1;i++) { order[blocks[pos_a][i]]=j+1; blocks[pos_b][j+1]=blocks[pos_a][i]; position[blocks[pos_a][i]]=pos_b; blocks[pos_a][i]=-1; j++; }}void pile_over(int a,int b){ int pos_a=position[a]; int pos_b=position[b]; int i,j; if(pos_a==pos_b) return; for(i=order[b]+1;blocks[pos_b][i]!=-1;i++); for(j=order[a];blocks[pos_a][j]!=-1;j++) { blocks[pos_b][i]=blocks[pos_a][j]; position[blocks[pos_a][j]]=pos_b; order[blocks[pos_a][j]]=i; blocks[pos_a][j]=-1; i++; }}int main(){ char s1[5],s2[5]; int a,b; scanf("%d",&n); init(); while(scanf("%s",s1)&&s1[0]!='q') { scanf("%d%s%d",&a,s2,&b); if(s1[0]=='m'&&s2[1]=='n') move_onto(a,b); if(s1[0]=='m'&&s2[1]=='v') move_over(a,b); if(s1[0]=='p'&&s2[1]=='n') pile_onto(a,b); if(s1[0]=='p'&&s2[1]=='v') pile_over(a,b); } for(int i=0;i!=n;i++) { printf("%d:",i); for(int j=0;blocks[i][j]!=-1;j++) printf(" %d",blocks[i][j]); printf("\n"); } return 0;}
貌似還可以在開一個數組,來記錄每個pile當前的blocks的個數,這樣就減少不需要用for迴圈找pile的最上面的那個block了。
這道題對我的意義蠻大的,第一次獨立完成,即使wa了8次也沒有看別人的代碼,而是自己找錯誤的資料。哈哈,keep moving!
zys love sky and shaow!