0

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];
}

どんな助けでも大歓迎です。ありがとう!

4

3 に答える 3

4

配列にはメソッドがありませんsize()!サイズを個別のパラメーターとして関数に渡すか、コンテナー(などstd::vector)を使用する必要があります。

于 2012-07-11T20:20:59.207 に答える
3

まず、生の C アレイからstd::array<>またはに切り替えるstd::vector<>ことが最善の策であるという他の回答に同意します。ただし、そうは言っても、クリスがコメントしたように、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次元が間違っていることに注意してください。

于 2012-07-11T20:25:56.107 に答える
1

top.size()関数に渡されたサイズに置き換える必要があります。さらに良いことに、配列を使用せず、代わりにベクトルを使用してください。その後、あなたtop.size()は働きます。

于 2012-07-11T20:20:16.933 に答える