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

  

posted @ 2012-02-24 13:58  书山有路,学海无涯  阅读(434)  评论(0编辑  收藏  举报