2012-07-11 27 views
0

請參閱:http://projecteuler.net/problem=18更好地解釋這個問題比我可以在這裏給出。項目歐拉18 - C++通過引用傳遞陣列

我喜歡我的算法;這不是蠻力。我查看金字塔底部的所有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]; 
} 

任何幫助是極大的讚賞。謝謝!

+1

引用通常是'int(&arr)[SIZE]'。查找螺旋規則從聲明中讀出。然而,你試圖做的其他東西需要某種像'std :: vector'這樣的容器,然而,它可以像普通變量一樣可以引導。 – chris 2012-07-11 20:19:18

+0

我的建議是創建一個適當的Triangle類,它可以處理輸入/輸出,並且可以輕鬆訪問像「三角形(i,j)」這樣的元素來訪問第i行的第j列。您目前的硬編碼表示不夠靈活。一旦你有適當的數據結構,制定通用算法將變得更容易(與你現在所做的「手動展開」循環相反)。參考:https://bitbucket.org/mitchnull/project-euler/src/634d2f8a50cb/src/triangle.hpp – mitchnull 2012-07-12 07:48:59

回答

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申報有錯誤的尺寸。

+0

Oh snap,SmallTop有錯誤的尺寸!大聲笑謝謝 – armani 2012-07-11 21:55:09

+0

我必須跑,所以我會回到這個主題明天 - 但是,我真的很有興趣實施你在這裏完成,FYI。感謝您花時間做到這一點。 – armani 2012-07-11 21:57:46

+0

呃,我吮吸這整個結構的東西。我繼續前進並使用了一個矢量,它運行得非常好。謝謝! – armani 2012-07-12 19:22:14

1

您需要用傳入該函數的大小替換top.size()。更好的是,不要使用數組,而是使用向量。然後你的top.size()將工作。

4

陣列沒有size()方法!您需要將大小作爲單獨的參數傳遞給函數,或者使用容器(例如std::vector)。

+2

更好的是,使用std :: array或boost :: array – 2012-07-11 20:22:25