算法分析实验之采花生遗留数组问题的解决

题目描述

鲁宾逊先生有一只宠物猴,名叫多多。这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。 鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1)。

有经验的多多一眼就能看出,每棵花生植株下的花生有多少。为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。” 我们假定多多在每个单位时间内,可以做下列四件事情中的一件:

1) 从路边跳到最靠近路边(即第一行)的某棵花生植株;

2) 从一棵植株跳到前后左右与之相邻的另一棵植株;

3) 采摘一棵植株下的花生;

4) 从最靠近路边(即第一行)的某棵花生植株跳回路边。

现在给定一块花生田的大小和花生的分布,请问在限定时间内,多多最多可以采到多少个花生?注意可能只有部分植株下面长有花生,假设这些植株下的花生个数各不相同。

例如在图2所示的花生田里,只有位于(2, 5), (3, 7), (4, 2), (5, 4)的植株下长有花生,个数分别为13, 7, 15, 9。沿着图示的路线,多多在21个单位时间内,最多可以采到37个花生。

输入

输入的第一行包括三个整数,M, N和K,用空格隔开;表示花生田的大小为M * N(1 <= M, N <= 20),多多采花生的限定时间为K(0 <= K <= 1000)个单位时间。接下来的M行,每行包括N个非负整数,也用空格隔开;第i + 1行的第j个整数Pij(0 <= Pij <= 500)表示花生田里植株(i, j)下花生的数目,0表示该植株下没有花生。

输出

输出包括一行,这一行只包含一个整数,即在限定时间内,多多最多可以采到花生的个数。

样例输入复制

6 7 21
0 0 0 0 0 0 0
0 0 0 0 13 0 0
0 0 0 0 0 0 7
0 15 0 0 0 0 0
0 0 0 9 0 0 0
0 0 0 0 0 0 0

样例输出

37

记得我上一篇关于这道题的解答中提到了用二维数组存数据出现的问题:前两个数据会变成0(非完全代码,只是关于数据存储的代码)代码及结果如下:
#include<iostream>
#include <algorithm>
using namespace std;
int main(){

    int m,n,k;
    cin>>m>>n>>k;
    int h=-1;
    int node[m*n][3];
    int a[m][n];
    for(int y=1;y<=m;y++)
        for(int x=1;x<=n;x++)
        {
            cin>>a[y][x];
            if(a[y][x]!=0)
            {
                h++;
                node[h][0]=y;
                node[h][1]=x;
                node[h][2]=a[y][x];
            }
        }

    for(int i=0;i<=h;i++) cout<<node[i][0]<<" "<<node[i][1]<<" "<<node[i][2]<<" "<<endl;

    return 0;
}

调试结果:

这里cin会把node里面的值重置掉,至于原因可能是一维数组的地址问题。

解决问题后的代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main(){

    int m,n,k;
    cin>>m>>n>>k;
    int h=-1;
    int node[m*n][5];
    for(int y=1;y<=m;y++)
        for(int x=1;x<=n;x++)
        {
            int t;
            cin>>t;
            if(t!=0)    //提取出有花生的位置
            {
                h++;
                node[h][0]=y;
                node[h][1]=x;
                node[h][2]=t;
            }
        }

//    for(int i=0;i<=h;i++) cout<<node[i][0]<<" "<<node[i][1]<<" "<<node[i][2]<<" "<<endl;
//根据花生的多少进行排序
    for(int i=0;i<=h;i++)
    {
        for(int j=i+1;j<=h;j++)
        if(node[i][2]<node[j][2])
        {
            int xx=node[i][0],yy=node[i][1],zz=node[i][2];
            node[i][0]=node[j][0];
            node[i][1]=node[j][1];
            node[i][2]=node[j][2];
            node[j][0]=xx;
            node[j][1]=yy;
            node[j][2]=zz;
        }
    }

    int sum=0;
    for(int i=0;i<=h;i++)
    {
        if(i==0) //到第一个点采花生
        {
            node[i][3]=node[i][0]+1;
            node[i][4]=node[i][2];
        }
        else { //到其他点采花生 

            //到这个点采完花生所用的时间用temp存
            int temp=node[i-1][3]+abs(node[i][0]-node[i-1][0])+abs(node[i-1][1]-node[i][1])+1;
            node[i][3]=temp;
            //到这个点一共采了多少花生
            node[i][4]=node[i-1][4]+node[i][2];
        }
//        cout<<node[i][0]<<" "<<node[i][1]<<" "<<node[i][2]<<" "<<node[i][3]<<" "<<node[i][4]<<" "<<endl;
        if(node[i][3]+node[i][0]<=k) sum=node[i][4]; //判断时间是否满足要求,更新sum值,即最多采的花生的数量
        else break;
    }
    cout<<sum<<endl;
    return 0;
}


原文地址:https://www.cnblogs.com/solititude/p/12578653.html

时间: 2024-10-14 04:39:54

算法分析实验之采花生遗留数组问题的解决的相关文章

实验九:二维数组和字符数组的应用

知识点: 二维数组的定义及引用:1.二维数组的定义: 二维数组的定义形式:类型名   数组名[行长度][列长度]:例如:        int  a[3][2]:        定义1个二维数组a,3行2列,6个元素: int   b[5][10]:        定义1个二维数组a,5行10列,50个元素: 二维数组的引用:行下标的范围:0~行长度-1:                        列下表的范围:0~列长度-1: 字符串的存储和运算可以用一维字符数组实现: 一维字符数组的定义

PAT-1001 采花生

题目描述 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”. 鲁宾逊先生和多多都很开心,因为花生正是他们的最爱.在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格.有经验的多多一眼就能看出,每棵花生植株下的花生有多少.为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路

课后实验4--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/chengqiqin07/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记

[编程题]采花生--为什么时间超了?

题目的描述为: 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”.鲁宾逊先生和多多都很开心,因为花生正是他们的最爱.在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格.有经验的多多一眼就能看出,每棵花生植株下的花生有多少.为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回

算法分析实验

实验一.算法分析实验 专业:商业软件工程   姓名:李智濠  学号:201506110117 一.        实验目的   编制一个词法分析程序. 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则. 三.        实验方法.步骤及结果测试   1.      源程序名:压缩包文件(rar或zip)中源程序名 kenk.c 可执行程序名:kenk.exe 2.      原理分析及流程图 对字符串表示的源程序 从左到右进行扫描和

采花生(模拟)

问题 D: 花生采摘 时间限制: 1 Sec  内存限制: 128 MB[提交] [状态] 题目描述 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”. 鲁宾逊先生和多多都很开心,因为花生正是他们的最爱.在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1).有经验的多多一眼就能看出,每棵花生植株下的花生有多少.为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它

数组下标越界异常解决方法

代码: 运行结果下标越界异常: 修改方法: 数组下标越界异常解决方法

实验6:Problem B: 数组类(II)

Description 封装一个模板数组类,用于存储数组和处理的相关功能,支持以下操作: 1. Array::Array(int l)构造方法:创建一个长度为l的组对象. 2. Array::size()方法:返回Array对象中元素个数. 3. Array::put(int n)方法:按从大到小的顺序输出前n大元素,若数组长度小于n则从大到小输出全部元素. 4. 下标运算符:返回下标所指的元素. -------------------------------------------------

课堂实验4.1(环数组)

题目: 返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值. 设计思想: 这是一个迭代的开发,是从上一个任务中的基础上进行的,在上一个的程序加上一个功能,就是将环形数组分成N个子数组,环形数组的每一个数字都可以作为每个数组的第一个