Pergunta
Eu estou tentando resolver Euler Problema 18 -> http://projecteuler.net /index.php?section=problems&id=18
Eu estou tentando fazer isso com c ++ (estou reaprendendo-lo e problemas de Euler para fazer uma boa aprendizagem / material de pesquisa)
#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;
}
A função countnums é usado para ir para baixo ou na diagonal. Eu testei essa função assim:
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;
E ela não funciona (eu também mudou a função um pouco para que ele iria imprimir cada número que estava passando)
Mas eu ainda não obter o resultado correto. Esta vai para baixo e para a direita e ainda vai para a direita (números adjacentes à direita), vai para baixo e mantém a descer (número adjacente à esquerda). O que estou fazendo de errado aqui, qualquer um?
Alastair: É simples
longa longo countnums sem sinal (curto start_x, curto, start_y matriz curto [] [15], tamanho curto, boleano goright, boleano goright2);
start_x e start_y são as coordenadas do array matriz é a referência para a matriz tamanho é apenas o tamanho da matriz (é sempre 15) goright é saber se eu estou indo para ir para baixo e para a direita ou apenas para baixo goright2 é saber se eu vou continuar a ir para baixo ou indo para a esquerda
Solução
Ok, então em primeiro lugar, eu sou um pouco incerto sobre o que você acha que é o problema. Eu não posso analisar essa segunda última frase em tudo ...
Em segundo lugar, você pode querer repensar seu projeto aqui. Pense em funções que executam uma única tarefa discreto e não são entrelaçados com o resto da aplicação (isto é, ler-se em "firmemente acoplado e ligado frouxamente"). Para mim, um sinal de alerta grande aqui é a presença de um countNums
nome da função excessivamente genérico com uma longa lista de argumentos.
Eu acho que se você tivesse que dividir o problema em partes menores, mais facilmente compreensível, pedaços que você pode encontrar os problemas muito mais fácil de encontrar. Eu sei que a abordagem que eu tomaria aqui, mas eu estou supondo que todo o ponto do exercício é para ajudar você a praticar suas habilidades de programação, então eu vou deixar por isso mesmo ...
Outras dicas
Eu já resolveu este problema. Dada a natureza do Projeto Euler é resolver o problema por conta própria ( "fotocópia de um jogo de palavras cruzadas resolvido não significa que você resolveu") e que eu não quero estragar isso para alguém, tudo o que posso dizer é que a sua solução parece excessivamente complexa.
Você pode, no entanto, resolver este problema como você está lendo o arquivo. Resolvê-lo desta forma e problema # 69 será uma brisa!
Boa sorte!
Estou um pouco confuso com o problema ..
Eu começaria por limpar seu código.
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;
}
Agora eu ler a pergunta e eu não estou certo de que está fazendo o que você quer.
Uma vez que este não é o que você quiser, eu sugiro psudo-code a resposta em primeiro lugar.
Esqueça o código .. Qual é a resposta em código sudo.
Ah, e para o amor de tudo que é santo. Não coloque mais de um inicializador no loop for. Eu sei que estou indo para obter críticas por isso, mas é confuso e realmente não precisava.
Algo que você pode considerar é uma função recusive. Parece ideal para este problema.
As principais verificações de função que uma entrada não zero é, mas a outra função que chama não verifica que mesmo que ele muda o índice novamente. Eu não sei, eu realmente não entendo o que você está tentando fazer.
Eu ver o tamanho da matriz 15 para 15 elementos, seria o índice para a declaração também começam em 0? Deixe-me ver por um segundo. Basta ter certeza que, declarada com tamanho, mas acessada baseado fora 0. O bom.
Por que você usa um aninhados para as demonstrações um lugar, mas uma condição compunded para a declaração mais tarde? Melhor verificar que o &&
não tem precedência maior do que o <
. Grupo 8 batidas fora do grupo 13 aqui . operador de incremento não usado várias vezes em um comunicado, isso é bom.
Parece que você já fez esse problema antes em outro idioma, você poderia fazer um traço sobre isso também e encontrar o lugar seus novos programas primeiros difere?
Os outros caras estão bem, a questão é confuso. Gostaria em primeiro lugar tentar resolver o problema buy construir subscores em outra matriz dando a maior pontuação se a pirâmide começou naquele momento e construí-la a partir da linha de base para o topo.