题目:烙煎饼,给你一个数字串,每次可以反转前面任意个,输出将串转化成递增的步骤。
分析:数据结构,栈。先将最大的放到最底下,然后第二大的放到导数第二层,以此类推。
设计一个子函数完成反转即可。处理区间 [1,n] 时如下(m为最大值位置):
1.如果当前寻找最大值在底部,则不需要处理;
2.如果当前寻找最大值在顶部,则反转前n个元素;
3.如果当前寻找最大值在中间,先反转前m个(将最大值置顶),然后反转前n个元素(同2)。
说明:模拟+dp(⊙_⊙)?
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int F[32];
void rev( int l, int r )
{
int temp;
while ( l < r ) {
temp = F[l];
F[l] = F[r];
F[r] = temp;
l ++; r --;
}
}
int over( int n, int m )
{
int flag = n;
for ( int i = 1 ; i < n ; ++ i )
if ( F[flag] < F[i] )
flag = i;
if ( flag != n ) {
if ( flag != 1 ) {
rev( 1, flag );
printf("%d ",m+1-flag);
}
rev( 1, n );
printf("%d ",m+1-n);
}
return flag;
}
int main()
{
int count;
while ( ~scanf("%d",&F[1] ) ) {
count = 1;
while ( (getchar()) != '\n' )
scanf("%d",&F[++ count]);
printf("%d",F[1]);
for ( int i = 2 ; i <= count ; ++ i )
printf(" %d",F[i]);
printf("\n");
for ( int i = count ; i > 0 ; -- i )
over(i, count);
printf("0\n");
}
return 0;
}