UVA-120- Stacks of Flapjacks

来源:互联网 发布:phpcms域名绑定目录 编辑:程序博客网 时间:2024/06/06 01:43

这是一道一开始就没做出来的题,到现在了,结合LRJ的思路,做出来了,但是代码写的还是不易懂,思路乱,我太菜了。

其实发现规律就两步:1.找出指针前面的最大值及其位置, 2.把刀放在最大值后面并进行颠倒操作(如果最大值位于首部则不颠倒) 3.把刀放在指针处进行颠倒操作

每一步都要检查是否完成,及时推出。

#include<stdio.h>#include<iostream>#include<string>#include<sstream>#include<string.h>using namespace std;int bing[35],temp[35];int main(){    string str;    while(getline(cin,str))    {        stringstream ss(str);        int num = 0;        while(ss>>bing[num++])  //一共num个数,下标从0到num - 1        {            if(num == 1) printf("%d",bing[num - 1]);            else printf(" %d",bing[num - 1]);        }          printf("\n");        num--;        for(int i = 0,j = num - 1;i < num;i++,j--)  //旋转数字            temp[i] = bing[j];        for(int i = 0;i < num;i++)            bing[i] = temp[i];        int zhizhen = 0,kase = 0;  //zhizhen是没有被冻结的数字下标        while(1)        {            int flag = 1;            for(int i = 1;i < num;i++)                if(bing[i] > bing[i - 1]) {flag = 0;break;}            if(flag) break;            int maxn = bing[zhizhen],maxnxia = zhizhen;            for(int i = zhizhen;i < num;i++) //找出最大值                if(bing[i] > maxn)                    {maxn = bing[i];maxnxia = i;}            if(maxnxia != num - 1)  //开始第一次颠倒!            {                memset(temp,0,sizeof(temp));                if(!kase)                    {printf("%d",maxnxia + 1);kase++;}                else  printf(" %d",maxnxia + 1);                for(int i = maxnxia,j = num - 1;i < num;i++,j--)                    temp[j] = bing[i];                for(int i = maxnxia;i < num;i++)                    bing[i] = temp[i];                memset(temp,0,sizeof(temp));                flag = 1;                for(int i = 1;i < num;i++)                    if(bing[i] > bing[i - 1]) {flag = 0;break;}                if(flag) break;            }            if(!kase)                {printf("%d",zhizhen + 1);kase++;}            else printf(" %d",zhizhen + 1);            for(int i = zhizhen,j = num - 1;i < num;i++,j--)                temp[j] = bing[i];            for(int i = zhizhen;i <num;i++)                bing[i] = temp[i];            flag = 1;            for(int i = 1;i < num;i++)                if(bing[i] > bing[i - 1]) {flag = 0;break;}            if(flag) break;            zhizhen++;        }        if(kase) printf(" 0\n");        else printf("0\n");    }    return 0;}


0 0