UVa 120 - Stacks of Flapjacks

翻饼问题,注意一下几点:


1、翻饼规则:只能从底层往上翻,也就是将前i个元素reverse,所以这里有个技巧,就是每次找到前i个元素里面最大的元素(假设是第m个),将其翻到第一层(前m个元素reverse),然后再翻到第i层(前i个元素reverse)(翻回来的时候一定是输出n-i,不是i)


2、输出的时候一定要输出输入行


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int max(int a[],int n)
{
    int i,max=a[0];
    for(i=1; i<n; i++)
    {
        if(a[i]>max)
            max=a[i];
    }
    return max;
}
int find(int a[],int n,int find)
{
    int i;
    for(i=0; i<n; i++)
    {
        if(a[i]==find)
            break;
    }
    return i;
}
void flap(int l,int r,int a[])
{
    for(int j=l; j<r/2; j++)
    {
        int temp=a[j];
        a[j]=a[r-1-j];
        a[r-1-j]=temp;
    }
}
int main()
{
    int a[40],flag,f,m,count=0;
    char t;
    while(scanf("%d%c",&a[count],&t)==2)
    {
        count++;
        if(t=='\n')
        {
            for(int i=0; i<count; i++)
            {
                if(!i)
                    printf("%d",a[i]);
                else
                    printf(" %d",a[i]);
            }
            printf("\n");
            for(int i=0; i<count; i++)
            {
                if(!i)
                {
                    flag=0;
                    for(int j=0; j<count-1; j++)
                    {
                        if(a[j]>a[j+1])
                            flag++;
                    }
                    if(flag==0)
                    {
                        printf("0\n");
                        memset(a,0,count);
                        count=0;
                        break;
                    }
                }
                m=max(a,count-i);
                f=find(a,count-i,m);
                if(!f)
                {
                    flap(0,count-i,a);
                    printf("%d ",i+1);
                }
                else if(f!=count-i-1)
                {
                    flap(0,f+1,a);
                    printf("%d ",count-f);
                    flap(0,count-i,a);
                    printf("%d ",i+1);
                }
                if(i)
                {
                    flag=0;
                    for(int j=0; j<count-1; j++)
                    {
                        if(a[j]>a[j+1])
                            flag++;
                    }
                    if(!flag)
                    {
                        printf("0\n");
                        memset(a,0,sizeof(a));
                        count=0;
                        break;
                    }
                }
            }
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值