程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> UVa 120 - Stacks of Flapjacks

UVa 120 - Stacks of Flapjacks

編輯:C++入門知識

翻餅問題,注意一下幾點:


1、翻餅規則:只能從底層往上翻,也就是將前i個元素reverse,所以這裡有個技巧,就是每次找到前i個元素裡面最大的元素(假設是第m個),將其翻到第一層(前m個元素reverse),然後再翻到第i層(前i個元素reverse)(翻回來的時候一定是輸出n-i,不是i)


2、輸出的時候一定要輸出輸入行


[cpp] 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int max(int a[],int n) 

    int i,max=a[0]; 
    for(i=1; i<n; i++) 
    { 
        if(a[i]>max) 
            max=a[i]; 
    } 
    return max; 

int find(int a[],int n,int find) 

    int i; 
    for(i=0; i<n; i++) 
    { 
        if(a[i]==find) 
            break; 
    } 
    return i; 

void flap(int l,int r,int a[]) 

    for(int j=l; j<r/2; j++) 
    { 
        int temp=a[j]; 
        a[j]=a[r-1-j]; 
        a[r-1-j]=temp; 
    } 

int main() 

    int a[40],flag,f,m,count=0; 
    char t; 
    while(scanf("%d%c",&a[count],&t)==2) 
    { 
        count++; 
        if(t=='\n') 
        { 
            for(int i=0; i<count; i++) 
            { 
                if(!i) 
                    printf("%d",a[i]); 
                else 
                    printf(" %d",a[i]); 
            } 
            printf("\n"); 
            for(int i=0; i<count; i++) 
            { 
                if(!i) 
                { 
                    flag=0; 
                    for(int j=0; j<count-1; j++) 
                    { 
                        if(a[j]>a[j+1]) 
                            flag++; 
                    } 
                    if(flag==0) 
                    { 
                        printf("0\n"); 
                        memset(a,0,count); 
                        count=0; 
                        break; 
                    } 
                } 
                m=max(a,count-i); 
                f=find(a,count-i,m); 
                if(!f) 
                { 
                    flap(0,count-i,a); 
                    printf("%d ",i+1); 
                } 
                else if(f!=count-i-1) 
                { 
                    flap(0,f+1,a); 
                    printf("%d ",count-f); 
                    flap(0,count-i,a); 
                    printf("%d ",i+1); 
                } 
                if(i) 
                { 
                    flag=0; 
                    for(int j=0; j<count-1; j++) 
                    { 
                        if(a[j]>a[j+1]) 
                            flag++; 
                    } 
                    if(!flag) 
                    { 
                        printf("0\n"); 
                        memset(a,0,sizeof(a)); 
                        count=0; 
                        break; 
                    } 
                } 
            } 
        } 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved