题意:
堆积木问题,四个移动条件要读对。
思路:
数据量小,直接模拟即可。
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std; const int N=30; const int inf=(1<<30); int n,m; int a[N][N]; void find(int now,int & ii,int &jj) { for(int i=0;i<n;i++) { for(int j=0;j<n&&a[i][j]!=-1;j++) { if(a[i][j]==now) { ii=i; jj=j; return ; } } } } void clear(int i,int j) { while(a[i][j]!=-1) { int tmp=a[i][j]; a[tmp][0]=tmp; a[i][j]=-1; j++; } } int main() { scanf("%d",&n); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) a[i][j]=-1; a[i][0]=i; } char str[10]; int u,v; while(scanf("%s",str),str[0]!='q') { scanf("%d",&u); if(str[0]=='m') { scanf("%s",str); scanf("%d",&v); int ui,uj,vi,vj; find(u,ui,uj); find(v,vi,vj); if(ui==vi) continue; if(str[1]=='n') { clear(vi,vj+1); a[vi][vj+1]=u; clear(ui,uj); } else { while(a[vi][vj]!=-1) { vj++; } a[vi][vj]=u; clear(ui,uj); } } else { scanf("%s",str); scanf("%d",&v); int ui,uj,vi,vj; find(u,ui,uj); find(v,vi,vj); if(ui==vi) continue; if(str[1]=='n') { vj++; clear(vi,vj); while(a[ui][uj]>=0) { a[vi][vj]=a[ui][uj]; a[ui][uj]=-1; uj++; vj++; } } else { while(a[vi][vj]!=-1) { vj++; } while(a[ui][uj]!=-1) { a[vi][vj]=a[ui][uj]; a[ui][uj]=-1; vj++; uj++; } } } } for(int i=0;i<n;i++) { printf("%d:",i); int j=0; while(a[i][j]!=-1) { printf(" %d",a[i][j]); j++; } printf("\n"); } return 0; }