C++ Euler 18-C和x2B项目+;通过引用传递数组
请参阅:以获得比我在此给出的更好的问题解释 我喜欢我的算法;这不是暴力。我查看金字塔底部的所有3x3三角形,以计算哪条路线最好,然后将该值赋回到该行。这就是为什么我的函数被称为ConsolidateBottomThreeRows——我将从下到上计算最佳路径,每次分配到最下面3行中的最上面部分,创建一个越来越小的金字塔,直到我的最上面一行包含答案 我的问题不是算法问题,只是语法问题。我不知道[是的,即使使用谷歌搜索]如何正确传递数组。以下是我尝试编译时的输出:C++ Euler 18-C和x2B项目+;通过引用传递数组,c++,arrays,C++,Arrays,请参阅:以获得比我在此给出的更好的问题解释 我喜欢我的算法;这不是暴力。我查看金字塔底部的所有3x3三角形,以计算哪条路线最好,然后将该值赋回到该行。这就是为什么我的函数被称为ConsolidateBottomThreeRows——我将从下到上计算最佳路径,每次分配到最下面3行中的最上面部分,创建一个越来越小的金字塔,直到我的最上面一行包含答案 我的问题不是算法问题,只是语法问题。我不知道[是的,即使使用谷歌搜索]如何正确传递数组。以下是我尝试编译时的输出: C:\MyApps\Euler>
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];
}
#包括
使用名称空间std;
整数三角形(整数顶部[],整数中间[],整数底部[])
{
int=0;
如果(中间[0]+底部[0]>最大值)最大值=中间[0]+底部[0];
如果(中间[0]+底部[1]>最大值)最大值=中间[0]+底部[1];
如果(中间[1]+底部[0]>最大值)最大值=中间[1]+底部[0];
如果(中间[1]+底部[1]>最大值)最大值=中间[1]+底部[1];
返回最大+顶部[0];
}
void ConsolidateBottom三行(内部顶部[]、内部中部[]、内部底部[])
{
int SmallTop[0]、SmallMiddle[2]、SmallBottom[3];
对于(int x=0;x您需要用传递给函数的大小替换top.size()
。更好的是,不要使用数组而使用向量。这样您的top.size()
就可以工作了。数组没有size()
method!您需要将大小作为单独的参数传递给函数,或者使用容器(例如std::vector
).首先,我同意其他答案,即从原始C数组切换到std::array
或std::vector
将是最好的选择。但是,正如chris评论的那样,也就是说,因为您的C数组是静态大小的,使将BottomThreeRows
合并到一个函数模板中使以下操作成为可能:e以及:
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);
}
}
模板
无效合并底部三行(内部和顶部)[TopN],
整数(&middle)[MidN],
整数(&bottom)[BotN])
{
int SmallTop[1]、SmallMiddle[2]、SmallBottom[3];
对于(std::size\u t x=0;x!=TopN;++x)
{
SmallTop[0]=top[x];
SmallMiddle[0]=中间[x];
SmallMiddle[1]=中间[x+1];
SmallBottom[0]=底部[x];
小底部[1]=底部[x+1];
小底部[2]=底部[x+2];
top[x]=CrunchSmallTriangle(SmallTop、SmallMiddle、SmallBottom);
}
}
请注意,SmallTop
的声明具有错误的维度。通过引用通常是int(&arr)[SIZE]
。查找螺旋规则以从声明中读出它。但是,您尝试执行的其他操作需要某种容器,如std::vector
,它可以像普通变量一样作为引用来引导。我的建议是创建一个适当的三角形类,可以处理输入/输出,并方便地访问其元素s如三角形(i,j)
用于访问第i行的第j列。您当前的硬编码表示方式不是很灵活。一旦您有了适当的数据结构,制定通用算法就会容易得多(而不是像您目前这样“手动展开”循环).Ref:更好的方法是,使用std::array或boost::arrayOh snap,SmallTop的维度确实不正确!哈哈,谢谢你,我必须运行,所以我明天会回到这个线程——不过,我真的很有兴趣实现你在这里所做的,仅供参考。谢谢你花时间这么做。呃,我对整个struct的东西一窍不通。我继续使用了一个向量,它工作得很好。谢谢!@armani:我不知道你说的“struct stuff”是什么意思。这里的代码是你的ConsolidateBottomThreeRows
函数的替代品,没有其他代码需要更改。