【问题标题】:Project Euler 18 - C++ Passing Array By ReferenceProject Euler 18 - C++ 通过引用传递数组
【发布时间】:2012-07-11 20:17:57
【问题描述】:

请参阅:http://projecteuler.net/problem=18,以获得比我在此处给出的更好的问题解释。

我喜欢我的算法;这不是蛮力。我查看金字塔底部的所有 3x3 三角形以计算最佳路线,然后将该值分配回该行。这就是为什么我的函数被称为 ConsolidateBottomThreeRows 的原因——我最终会从下往上计算最佳路径,每次都分配给底部 3 行的最顶部,创建一个越来越小的金字塔,直到我的第一行包含答案.

我的问题不是算法问题,只是语法问题。我无法弄清楚 [是的,即使使用谷歌搜索] 如何正确传递我的数组。这是我尝试编译时的输出:

C:\MyApps\Euler>g++ Prob_18.cpp -o Prob_18
Prob_18.cpp: In function 'void ConsolidateBottomThreeRows(int*, int*, int*)':
Prob_18.cpp:17:20: error: request for member 'size' in 'top', which is of non-class type 'int*'

还有我的代码:

#include <iostream>
using namespace std;

int CrunchSmallTriangle(int top[], int middle[], int bottom[])
{
    int biggest=0;
    if(middle[0]+bottom[0] > biggest) biggest=middle[0]+bottom[0];
    if(middle[0]+bottom[1] > biggest) biggest=middle[0]+bottom[1];
    if(middle[1]+bottom[0] > biggest) biggest=middle[1]+bottom[0];
    if(middle[1]+bottom[1] > biggest) biggest=middle[1]+bottom[1];
    return biggest+top[0];
}

void ConsolidateBottomThreeRows(int top[], int middle[], int bottom[])
{
    int SmallTop[0], SmallMiddle[2], SmallBottom[3];
    for(int x=0;x<top.size();x++)
    {
        SmallTop[0]=top[x];
        SmallMiddle[0]=middle[x];
        SmallMiddle[1]=middle[x+1];
        SmallBottom[0]=bottom[x];
        SmallBottom[1]=bottom[x+1];
        SmallBottom[2]=bottom[x+2];
        top[x]=CrunchSmallTriangle(SmallTop, SmallMiddle, SmallBottom);
    }
}

int main()
{
    int row1[1]={75};
    int row2[2]={95,64};
    int row3[3]={17,47,82};
    int row4[4]={18,35,87,10};
    int row5[5]={20,4,82,47,65};
    int row6[6]={19,1,23,75,3,34};
    int row7[7]={88,2,77,73,7,63,67};
    int row8[8]={99,65,4,28,6,16,70,92};
    int row9[9]={41,41,26,56,83,40,80,70,33};
    int row10[10]={41,48,72,33,47,32,37,16,94,29};
    int row11[11]={53,71,44,65,25,43,91,52,97,51,14};
    int row12[12]={70,11,33,28,77,73,17,78,39,68,17,57};
    int row13[13]={91,71,52,38,17,14,91,43,58,50,27,29,48};
    int row14[14]={63,66,4,68,89,53,67,30,73,16,69,87,40,31};
    int row15[15]={4,62,98,27,23,9,70,98,73,93,38,53,60,4,23};

    ConsolidateBottomThreeRows(row13, row14, row15);
    ConsolidateBottomThreeRows(row11, row12, row13);
    ConsolidateBottomThreeRows(row9, row10, row11);
    ConsolidateBottomThreeRows(row7, row8, row9);
    ConsolidateBottomThreeRows(row5, row6, row7);
    ConsolidateBottomThreeRows(row3, row4, row5);
    ConsolidateBottomThreeRows(row1, row2, row3);

    cout<<row1[0];
}

非常感谢任何帮助。谢谢!

【问题讨论】:

  • 引用通常是int (&amp;arr)[SIZE]。查找螺旋规则以从声明中读出它。但是,您尝试做的其他事情需要某种容器,例如std::vector,它可以像普通变量一样作为引用来启动。
  • 我的建议是创建一个适当的 Triangle 类来处理输入/输出,并轻松访问其元素,如 triangle(i, j) 以访问第 i 行的第 j 列。您当前的硬编码表示不是很灵活。一旦你有了适当的数据结构,制定通用算法就会容易得多(而不是像你现在做的那样“手动展开”你的循环)。参考:bitbucket.org/mitchnull/project-euler/src/634d2f8a50cb/src/…

标签: c++ arrays


【解决方案1】:

数组没有size() 方法!您要么需要将大小作为单独的参数传递给函数,要么使用容器(例如std::vector)。

【讨论】:

  • 更好的是,使用 std::array 或 boost::array
【解决方案2】:

首先,我同意其他答案,即从原始 C 数组切换到 std::array&lt;&gt;std::vector&lt;&gt; 将是最好的选择。然而,话虽如此,正如 chris 所评论的那样,因为您的 C 数组是静态大小的,所以将 ConsolidateBottomThreeRows 制作成函数模板也可以实现以下操作:

template<std::size_t TopN, std::size_t MidN, std::size_t BotN>
void ConsolidateBottomThreeRows(int (&top)[TopN],
                                int (&middle)[MidN],
                                int (&bottom)[BotN])
{
    int SmallTop[1], SmallMiddle[2], SmallBottom[3];
    for (std::size_t x = 0; x != TopN; ++x)
    {
        SmallTop[0] = top[x];
        SmallMiddle[0] = middle[x];
        SmallMiddle[1] = middle[x + 1];
        SmallBottom[0] = bottom[x];
        SmallBottom[1] = bottom[x + 1];
        SmallBottom[2] = bottom[x + 2];
        top[x] = CrunchSmallTriangle(SmallTop, SmallMiddle, SmallBottom);
    }
}

请注意,您的 SmallTop 声明的尺寸有误。

【讨论】:

  • 噢,SmallTop 的尺寸确实有误!大声笑谢谢
  • 我必须跑步,所以我明天会回到这个线程——但是,我真的很想实现你在这里所做的事情,仅供参考。感谢您花时间这样做。
  • 呃,我对这整个 struct 的东西很烂。我继续使用矢量,效果很好。谢谢!
  • @armani :我不确定你所说的“struct stuff”是什么意思。此处的代码是您的 ConsolidateBottomThreeRows 函数的直接替换,无需更改其他代码。
【解决方案3】:

您需要将top.size() 替换为传入函数的大小。更好的是,不要使用数组而是使用向量。然后你的top.size() 就可以了。

【讨论】:

    猜你喜欢
    • 2020-07-30
    • 2012-04-17
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 2012-05-13
    • 2013-11-07
    相关资源
    最近更新 更多