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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top