UVa 120 Stacks of Flapjacks
纯属模拟,但关键分为三种情况:最大的(没有排好的)元素在最底下、在最上面、在其他位置。
第一种情况:不需要排,因为已经在该在的位置。
第二种情况:需要一步,从它应该在的位置翻转一下。
第三种情况:需要两步,先把它翻转到最上面去,然后再从它应该在的位置翻转一次。
翻转操作我用栈和队列来回倒换。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<stack> #include<algorithm> using namespace std; #define MAXINT 1234567890 int kk[35]; stack <int> S,K; queue <int> Q; int cmp(int a,int b) { return a>b; } int main() { int i,n,k,j,count; while(scanf("%d",&kk[1])!=EOF) { printf("%d",kk[1]); n=1; while(getchar()!='\n') { scanf("%d",&kk[++n]); printf(" %d",kk[n]); } printf("\n"); for(i=n;i>=1;i--) S.push(kk[i]); sort(kk+1,kk+1+n,cmp); for(i=1;i<n;i++) { count=1; while(!S.empty() && S.top()!=kk[i]) { count++; Q.push(S.top()); S.pop(); } if(count==1) { k=n+1-i; for(j=0;j<k;j++) { Q.push(S.top()); S.pop(); } while(!Q.empty()) { S.push(Q.front()); Q.pop(); } printf("%d ",i); } else if(n+1-count==i) { while(!Q.empty()) { K.push(Q.front()); Q.pop(); } while(!K.empty()) { S.push(K.top()); K.pop(); } } else { printf("%d ",n+1-count); Q.push(S.top()); S.pop(); while(!Q.empty()) { S.push(Q.front()); Q.pop(); } printf("%d ",i); k=n+1-i; for(j=0;j<k;j++) { Q.push(S.top()); S.pop(); } while(!Q.empty()) { S.push(Q.front()); Q.pop(); } } } printf("0\n"); S.pop(); } return 0; }