采蘑菇问题

查了下采蘑菇问题,用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:~$

原文地址:https://www.cnblogs.com/McQueen1987/p/3544875.html