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