請參閱: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];
}
任何幫助是極大的讚賞。謝謝!
引用通常是'int(&arr)[SIZE]'。查找螺旋規則從聲明中讀出。然而,你試圖做的其他東西需要某種像'std :: vector'這樣的容器,然而,它可以像普通變量一樣可以引導。 – chris 2012-07-11 20:19:18
我的建議是創建一個適當的Triangle類,它可以處理輸入/輸出,並且可以輕鬆訪問像「三角形(i,j)」這樣的元素來訪問第i行的第j列。您目前的硬編碼表示不夠靈活。一旦你有適當的數據結構,制定通用算法將變得更容易(與你現在所做的「手動展開」循環相反)。參考:https://bitbucket.org/mitchnull/project-euler/src/634d2f8a50cb/src/triangle.hpp – mitchnull 2012-07-12 07:48:59