我正在尝试解决欧拉问题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是要知道我是继续下去还是离开
答案 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。增量运算符在语句中没有多次使用,这很好。
听起来你以前用另一种语言做过这个问题,你是否也可以对此进行追踪并找到新程序首先出现的地方?
其他人都是对的,问题很混乱。我会首先尝试解决问题,如果金字塔从那个点开始并从底行到顶部构建,则在另一个矩阵中建立子分数给出最高分。