zoukankan      html  css  js  c++  java
  • 采蘑菇问题

    查了下采蘑菇问题,用c写的相当困难,把自己绕进去了。

    最后发现问题出在:采蘑菇的小姑娘起始位置是在数组之外的,而非数组的起始位置。所以在数组下标上折腾了好久。

     

    采蘑菇问题描述引用以下博客:

    http://blog.chinaunix.net/uid-26456800-id-3194477.html

    【描述】

    萌萌走出山路后,来到一片草地,发现过了草地有巨型蘑菇,于是他准备采摘一些。但是他对保护花草却很重视,他不忍心踩死花草,但为了蘑菇,他只能尽量少踩死几株。现在,草地上也像一条路,上面有n个点,第N个点就是巨型蘑菇所在地(上面没草),每个点上都有i株小草或j株蘑菇(也就是说有蘑菇就没有草),他每次最多跨越k步。

    现在请为他选择一条路,在踩死尽量少的小草下,去采蘑菇。

    P.S:默认出发点为:1,结束点为:N;

    【输入格式】

    第一行2个数:

    n(表示这条路的长度),k(每次最多跨越数)

    接下来第二行,n个数:

    a[0],a[1],a[2],a[3]a[n-1](就是相应株数的小草,例如:

    0 0 1 2 0【这是说第3个点有1株草,第4个点有2株草】)

    (注意,如果小姑娘第一跳跨数为1,说明跳到了位置a[0],

    小姑娘的起始位置位于数组外) 

     

    【输出格式】

    一个数,最少踩到的小草株数:m

    输入样例

    5 2

    0 1 1 2 0

    输出样例

    1

    (只踩到了第3株)

    数据范围

    N,k<=10000;

    A[i]<=100;

     

    第一次写的,虽然实现了功能,但是有些瑕疵:

    #include<stdio.h>
    #include<stdlib.h>
    
    int input[]={1,0,3};
    int startP=-1;//-1表示从数组外开始往数组内跳
    int inplen=3;
    int minSUM=0xff;
    int step=2;
    void FUN1(int inp[],int start,int sum){//sum是数组中start位的值+start前面跳的值;
            int i=1;
            for(;i<=step;i++){
                    if((start+i+1)>inplen){//表示数组遍历完毕后跳出结束
                            if(sum<minSUM)  minSUM = sum;
                            return;
                    }
                    printf("start = %d cur = %d sum =%d
    ",start, 
    start+i ,sum + inp[start+i]); FUN1(inp,start+i,sum + inp[start + i]);//sum是start位往前所有踩过的数的和 } } int main(int argc, char* argv[]) { FUN1(input,startP,0); printf("minSUM = %d ",minSUM); return 0; }

    输出:

    xu@xu-ThinkPad-X61:~$ gcc caimogu2.c
    xu@xu-ThinkPad-X61:~$ ./a.out
    start = -1 cur = 0 sum =1
    start = 0 cur = 1 sum =1
    start = 1 cur = 2 sum =4
    start = 0 cur = 2 sum =4
    start = -1 cur = 1 sum =0
    start = 1 cur = 2 sum =3
    minSUM = 0

    问题:

    1:累加器sum作为参数传递进去,想实现记录每次踩到小草的个数;由于sum不仅与当前递归有关,而且与下一次递归也有联系,容易出错;尽量用返回值的方法,避免思路不清;

    2:递归貌似从后往前累加的,我这个方法sum其实是从前往后加的,不是我的初衷。

    3:综合说来我的代码前期函数功能没有定义清晰,细节上的处理还是不够流畅;

    请教高人后,在原来基础上修改了代码,这下对递归的认识清晰很多,下面看看改进版的:

    #include<stdlib.h>
    #include<stdio.h>
    
    int step=2;
    int inplen=5;
    
    int FUN(int inp[],int start){
            if(start > (inplen -1))
                    return 0;
            int tmp=0;
            int min=0xffff;
            int k=1;
            for(;k<=step;k++){
                    tmp=FUN(inp,start+k);
                    if(tmp<min) min=tmp;
                    printf("start %d  = %d
    ",start, tmp);
            }
            return min+inp[start];
    }
    
    int main(){
            int input[]={1,2,0,3,2};
            int ret=FUN(input,0);
            printf("-------%d
    ",ret);
            return 0;
    }

    输出:

    xu@xu-ThinkPad-X61:~$ gcc caimogu.c
    xu@xu-ThinkPad-X61:~$ ./a.out
    start 4 = 0
    start 4 = 0
    start 3 = 2
    start 3 = 0
    start 2 = 3
    start 4 = 0
    start 4 = 0
    start 2 = 2
    start 1 = 2
    start 4 = 0
    start 4 = 0
    start 3 = 2
    start 3 = 0
    start 1 = 3
    start 0 = 4
    start 4 = 0
    start 4 = 0
    start 3 = 2
    start 3 = 0
    start 2 = 3
    start 4 = 0
    start 4 = 0
    start 2 = 2
    start 0 = 2
    -------3
    xu@xu-ThinkPad-X61:~$

  • 相关阅读:
    rest framework 认证 权限 频率
    rest framework 视图,路由
    rest framework 序列化
    10.3 Vue 路由系统
    10.4 Vue 父子传值
    10.2 Vue 环境安装
    10.1 ES6 的新增特性以及简单语法
    Django 跨域请求处理
    20190827 On Java8 第十四章 流式编程
    20190825 On Java8 第十三章 函数式编程
  • 原文地址:https://www.cnblogs.com/McQueen1987/p/3544875.html
Copyright © 2011-2022 走看看