模拟排序特训:煎饼(UVA120)

解题思路:这里的排序可以通过按照一定的顺序操作,先将最底下的煎饼归位(找到该点应该放的煎饼处于的位置,先将这个煎饼翻转到最上方,然后再次翻转归位),依次向上,这样不会出现互相干扰的情况。注意代码中要进行一些判别,比如某个煎饼已经是处于正确的位置则不需要再做任何操作,或者某个煎饼已经在最顶上则只需要反转归位即可,这些处理需要引起注意。

题目大意:

输入给定一个序列,相当于是煎饼层层叠起。通过输入操作可以将某一煎饼上所有煎饼反转。

比如下面三个煎饼叠(煎饼8是左边一叠的最上面的一个)

         8           7           2
         4           6           5
         6           4           8
         7           8           4
         5           5           6
         2           2           7

可以通过3,1两次操作从第一个煎饼状态到第三个状态。问经过一系列什么样的操作可以达成从上到小增序的排列。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

int s[100];
int a[100];
int n;

void reverse(int k)      //将序列为k及以上的煎饼翻转 
{
	int st=k;
	int end=n-1;
	while(end>st)
	{
		swap(s[st++],s[end--]);
	}
}

int cmp(int a,int b)
{
	return a>b;
}

int main()
{
	while(cin>>n)
	{
		for(int i=n-1;i>=0;i--)
		{
			cin>>s[i];
		}
		memcpy(a,s,sizeof(s));
		sort(a,a+n,cmp);
		for(int i=n;i>=1;i--)
		{
			for(int j=0;j<n;j++)
			{
				if(s[j]==i)        
				{
					if(j==n-i) break;     //如果已经就位则不需要进一步处理 
					
					if(j!=n-1)           //不在顶端则先将该煎饼翻转至顶部 
					{
						reverse(j);
						cout<<j+1<<" ";
					}
					reverse(n-i);
					cout<<n-i+1<<" ";
					break;
				}
			}
		}
		cout<<0<<endl;
	}
}

猜你喜欢

转载自blog.csdn.net/mavises/article/details/81949865