UVa 120 - Stacks of Flapjacks

来源:互联网 发布:all先导爱知 编辑:程序博客网 时间:2024/05/04 15:45
题意:给一摞随意摞的煎饼,要按直径从上到下递增的顺序排列,求翻的顺序。

思路:贪心。

1,读取煎饼数据,新建一个数组,复制数据,排序,作为参考。

2,从最大直径(maxNum)的煎饼开始,看其是否在底层,是的话就寻找上一层最大的。

3,假如不在底层,看其在不在顶层,在顶层就把全部煎饼翻过来,使当前需要操作的最大的直径煎饼放在最下。

4,假如不在底层也不在顶层,就找到它,先翻到顶层,然后步骤同3.

直到maxNum代表数据为最小直径的煎饼。

代码:

#include <iostream>#include <cstring>#include <cstdio>#include <cstdlib>#include <algorithm>using namespace std;#define MAXN 110class Flapjacks{    private:        int jacks[MAXN];        int ansJack[MAXN+MAXN];        int ansLoop;    public:        void init();        void process();        void reserv(int a[],int num);//反转数组操作,num为反转位置        void output();};void Flapjacks::reserv(int a[],int num){    int tempArry[num];    for(int loop1 = num - 1,loop2 = 0;loop1 >= 0;loop1--){        tempArry[loop2++] = a[loop1];    }    for(int loop1 = 0;loop1 < num;loop1++){        a[loop1] = tempArry[loop1];    }}void Flapjacks::init(){    memset(jacks,0,sizeof(jacks));}void Flapjacks::process(){    int loop = 0,n;    char c;    while(scanf("%d%c",&n,&c)!=EOF){        if(c != '\n'){            printf("%d ",n);            jacks[loop++] = n;        }        else {            jacks[loop++] = n;            cout<<n<<endl;            int clon[MAXN],maxNum;            for(int i = 0;i < loop;i++)                clon[i] = jacks[i];            sort(clon,clon + loop);            ansLoop = 0;            ansJack[0] = 0;            for(int i = loop - 1;i >= 0;i--){                maxNum = clon[i];//maxNum 记录当前未正确归位的煎饼                if(maxNum == jacks[i]){                    continue;                }                else{                    if(jacks[0] == maxNum){//需要操作的煎饼在最上边时的操作                        reserv(jacks,i+1);//从loop - i处反转                        ansJack[ansLoop++] = loop - i;                    }                    else{                        for(int j = 0;j < loop;j++){//需要操作的煎饼在不最上边时的操作                            if(jacks[j] == maxNum){                                reserv(jacks,j+1);                                ansJack[ansLoop++] = loop - j ;                                break;                            }                        }                        reserv(jacks,i+1);                        ansJack[ansLoop++] = loop - i;                    }                }            }            output();            loop = 0;            init();        }    }}void Flapjacks::output(){    for(int i = 0;i < ansLoop;i++){        cout<<ansJack[i]<<" ";    }    cout<<0<<endl;}int main(){    //#ifndef ONLINE_JUDGE    //    freopen("D:\\acm.txt","r",stdin);   // #endif // ONLINE_JUDGE    Flapjacks flapjacks;    flapjacks.process();    return 0;}


0 0
原创粉丝点击