UVa_120 stack of flapjack

本文详细解析了一个关于栈操作的问题,即如何通过一系列的翻转操作使得一组按特定顺序排列的数字变成目标顺序。该问题涉及到数组的逆序存储及算法实现,包括查找最大值并进行翻转等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

stacks of flapjacks

参考:http://blog.youkuaiyun.com/u012315428/article/details/12237291

题目意思有点难理解,但是看上文解释还是很清楚的。主要要注意的是输入数据顺序是顺序的,而题目的要求数据的顺序是逆序的。也就是说,

假设你输入的是 5,4,3,2,1 。一般存入数组的顺序是 a[1],a[2],.... 但是题目的意思是顶端是 n, 底端是 1, 就是存入数组的顺序与下标顺序相反。

首先要先翻转一次。

code:

#include <stdio.h>
#define maxn 40

int st[maxn], n;

void swap( int i, int j ){
    int t = st[i];
    st[i] = st[j];
    st[j] = t;
}

void flip( int k ){
    for( int i = k; i <= (n + k)/2; i++ )
        swap( i, n-i+k );
}

int findMax( int cur ){
    int k = cur, mt = st[cur];
    for( int i = cur; i <= n; i++ )
        if( st[i] > mt ){
            mt = st[i];
            k = i;
        }
    return k;
}

int main(){
    char t;
    n = 1;
    while( scanf( "%d%c", &st[n], &t ) == 2 ){
        printf( "%d%c", st[n], t );
        n++;
        if( t == '\n' || t == '\r' ){ // 一行输入结束
            --n;
            flip( 1 );    // 将所有数据翻转,一行输入结束时,n的值比元素个数大1       
            int cur = 1;     // 当前插入元素的位置,从底到上编号 1 到 n 
            for( int i = 0; i < n; i++ ){
                int k = findMax( cur );      // [cur,n] 中的最大值坐标
                if( k != cur ){
                    if( k != n ){
                        flip( k );
                        printf( "%d ", k );
                    }
                    flip( cur );
                    printf( "%d ", cur );
                }
                ++cur;
            }    
           printf( "0\n" );
           n = 1;
        }
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值