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:~$

  • 相关阅读:
    用ASP+DLL实现WEB方式修改服务器时间
    参加了 湖南.NET俱乐部成立大会
    Asp.Net中文本换行
    一直在思考的问题
    GRIDVIEW排序 动态实现和静态实现
    在VS 2005中使用TREEVIEW控件
    GRIDVIEW 中当数据行数未满时,填充空白行
    为了自己的心身健康 合理安排生活 特做了张时间安排表
    在VS 2005后台代码中创建用户控件
    CSS IE7 IE6 Firefox多浏览器兼容(转&摘)
  • 原文地址:https://www.cnblogs.com/McQueen1987/p/3544875.html
Copyright © 2011-2022 走看看