120 - Stacks of Flapjacks

题目看了半天......英语啊!!!

好久没做题...循环输入数字都搞了半天...罪过啊!!!

还是C方便一点...其实C++应该更方便的...C++得再看看!!!

#include <iostream>
#include <cstdio>

using namespace std;

/*翻转*/
void myReverse(int arr[],int s,int e)    
{
    while (s<e)
    {
        int temp=arr[s];
        arr[s]=arr[e];
        arr[e]=temp;
        s++;
        e--;
    }
}

int main(void)
{
    int temp;
    while (scanf("%d",&temp)!=EOF)
    {
        int myArr[30];
        myArr[0]=temp;
        int myCount=1;

        while (getchar()!='\n')
        {
            cin>>myArr[myCount++];
        }

        /*输出原始的*/
        for (int i=0;i<myCount-1;i++)
        {
            cout<<myArr[i]<<" ";
        }
        cout<<myArr[myCount-1]<<endl;

        for (int i=myCount-1;i>=0;i--)   //针对此次最大的数
        {
            /*先找到此次最大数的位置*/
            int thisMaxIndex=i;    //注意记录的是下标
            for (int j=i-1;j>=0;j--)
            {
                if (myArr[j]>myArr[thisMaxIndex])
                {
                    thisMaxIndex=j;
                }
            }

            if(thisMaxIndex==i)   //此次的最后一个已经是最大的了,不要操作
            {
                continue;
            }
            else if(thisMaxIndex==0)   //最大的第一个数,
            { 
                cout<<(myCount-i)<<" ";   //直接从后面翻一下,注意输出
                myReverse(myArr,0,i);
            }
            else
            {
                cout<<(myCount-thisMaxIndex)<<" ";
                myReverse(myArr,0,thisMaxIndex);
                i++;   //再继续此次循环
            }
        }

        cout<<"0\n";   //最后输出0;
    }
    return 0;
}

 

总结:

1.while (scanf("%d",&temp)!=EOF)的循环输入判读

2.while (getchar()!='\n')  {  cin>>myArr[myCount++];} 看输入,读了一个数字之后紧接着要么是一个空格,要么是结尾的换行符,这里这代码漂亮!空格读了就不要了然后直接读数字,是换行就退出了循环,紧密结合了实际!

3.每次循环的处理,最外层是由后向前,保证处理过的都是有序的大的数.每次循环,要是不合要求再 i-- ,即再来这次循环!

posted on 2013-12-31 12:09  简单的信仰  阅读(230)  评论(0编辑  收藏  举报