三角问题

时间:2008-11-17 00:10:30

标签: c++ puzzle

我正在尝试解决欧拉问题18 - > http://projecteuler.net/index.php?section=problems&id=18

我正在尝试用c ++做这件事(我正在重新学习它,而且euler问题会带来良好的学习/搜索材料)

#include <iostream>

using namespace std;

long long unsigned countNums(short,short,short array[][15],short,bool,bool);

int main(int argc,char **argv) {

    long long unsigned max = 0;
    long long unsigned sum;


    short piramide[][15] = {{75,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                            {95,64,0,0,0,0,0,0,0,0,0,0,0,0,0},
                            {17,47,82,0,0,0,0,0,0,0,0,0,0,0,0},
                            {18,35,87,10,0,0,0,0,0,0,0,0,0,0,0},
                            {20,4,82,47,65,0,0,0,0,0,0,0,0,0,0},
                            {19,1,23,75,3,34,0,0,0,0,0,0,0,0,0},
                            {88,2,77,73,7,63,67,0,0,0,0,0,0,0,0},
                            {99,65,4 ,28,6,16,70,92,0,0,0,0,0,0,0},
                            {41,41,26,56,83,40,80,70,33,0,0,0,0,0,0},
                            {41,48,72,33,47,32,37,16,94,29,0,0,0,0,0},
                            {53,71,44,65,25,43,91,52,97,51,14,0,0,0,0},
                            {70,11,33,28,77,73,17,78,39,68,17,57,0,0,0},
                            {91,71,52,38,17,14,91,43,58,50,27,29,48,0,0},
                            {63,66,4,68,89,53,67,30,73,16,69,87,40,31,0},
                            {4,62,98,27,23,9,70,98,73,93,38,53,60,4,23}};

    for (short i = 0;i<15;i++) {
        for (short m=0;m<15;m++) {
            if (piramide[i][m] == 0)
                break;
            sum = countNums(i,m,piramide,15,true,true);
            if (sum > max)
                max = sum;
            sum = countNums(i,m,piramide,15,true,false);
            if (sum > max)
                max = sum;
            sum = countNums(i,m,piramide,15,false,true);
            if (sum > max)
                max = sum;
            sum = countNums(i,m,piramide,15,false,false);
            if (sum > max)
               max = sum;

        }

    }
    cout << max;
    return 0;
}


long long unsigned countNums(short start_x,short start_y,short array[][15],short size, bool goright,bool goright2) {
    long long unsigned currentSum;

    currentSum = array[start_x][start_y];

    if (goright) { //go right
        if ((start_x + 1) < size)
            start_x++;
        if ((start_y + 1) < size)
            start_y++;
    }
    else //go down
        if ((start_x + 1) < size)
            start_x++;

    if (goright2) { //still going right
        for (short i = start_x, m = start_y;i< size && m < size;i++,m++) {
            currentSum += array[i][m];         
        }
    }
    else { //still going down
        for (short i = start_x;i<size;i++) {
            currentSum += array[i][start_y];            
        }
    }

    return currentSum;
}

countNums函数用于向下或对角。 我已经测试了这个函数:

short a = 0;
short b = 0;
cout << countNums(a,b,piramide,15,true,true) << endl;
cout << countNums(a,b,piramide,15,true,false) << endl;
cout << countNums(a,b,piramide,15,false,true) << endl;
cout << countNums(a,b,piramide,15,false,false) << endl;
return 0;

它确实有效(我也稍微更改了功能,因此它会打印它经历的每个数字)

但我仍然没有得到正确的结果。这下降到右边,仍然向右(右边的相邻数字),向下并继续向下(左边的相邻数字)。 我在这里做错了什么,有人吗?


Alastair:很简单

long long unsigned countNums(short start_x,short start_y,short array [] [15],short size,bool goright,bool goright2);

start_x和start_y是数组的坐标 array是对数组的引用 size只是数组的大小(它总是15) goright是要知道我是要下来还是向右或向下 goright2是要知道我是继续下去还是离开

4 个答案:

答案 0 :(得分:3)

好的,首先,我不清楚你认为问题是什么。我根本无法解析倒数第二句......

其次你可能想在这里重新考虑你的设计。考虑执行单个离散任务的函数,而不是与应用程序的其余部分交织在一起(即读取“紧耦合和松散绑定”)。对我来说,这里的一个重要警告是存在一个过于通用的函数名countNums,其中包含很长的参数列表。

我认为如果你将问题分成更小,更容易理解的块,你可能会发现问题更容易找到。我知道我会采取的方法,但我假设这个练习的重点是帮助你练习你的编程技巧,所以我就把它留在那里......

答案 1 :(得分:1)

我已经解决了这个问题。鉴于项目Euler的性质是自己解决问题(“复制一个解决的填字游戏并不意味着你解决了它”)并且我不想为别人毁了这个,我真的可以说是你的解决方案看起来过于复杂。

但是,您可以在阅读文件时解决此问题。以这种方式解决问题#69将会变得轻而易举!

祝你好运!

答案 2 :(得分:0)

我对这个问题感到有点困惑。
我首先要清理你的代码。

long long unsigned countNums(short x,
                             short y,
                             short array[][15],
                             short size, 
                             bool goright,
                             bool goright2) 
{
    long long unsigned currentSum;
    currentSum = array[x][y];

    if ((x + 1) < size)    x++; //this happened in both your if cases

    if (goright && ((y + 1) < size)      y++; 

    if (goright2)
    { 
        for (;x< size && y< size;x++,y++)
            currentSum += array[x][y];         

    }
    else 
    {
        for (;x<size;x++) 
            currentSum += array[x][y];            
    }
    return currentSum;
 }

现在我读了这个问题,我不确定它是在做你想要的。 因为这不是你想要的,所以我建议先把psudo-code作为答案。 忘记代码.. sudo代码的答案是什么?
哦,因为所有圣洁的爱。不要在for循环中放置多个初始化程序。我知道我会为此做好准备,但它很乱,真的不需要。 您可能会考虑的是一种重复功能。似乎是这个问题的理想选择。

答案 3 :(得分:0)

main函数检查条目不为零,但它调用的另一个函数不会检查它,即使它再次更改索引。我不知道,我真的不明白你想做什么。

我看到15个元素的数组大小为15,声明的索引是否也从0开始?让我检查一下。只是确定,声明大小但基于0访问。好。

为什么你在一个地方使用嵌套的for语句,但稍后会使用compunded-condition for语句?最好检查&&的优先级是否高于<。第8组击败第13组here。增量运算符在语句中没有多次使用,这很好。

听起来你以前用另一种语言做过这个问题,你是否也可以对此进行追踪并找到新程序首先出现的地方?

其他人都是对的,问题很混乱。我会首先尝试解决问题,如果金字塔从那个点开始并从底行到顶部构建,则在另一个矩阵中建立子分数给出最高分。