Question

J'essaie de résoudre le problème Euler 18 - > http://projecteuler.net/index.php?section=problems < !> amp; id = 18

J'essaie de faire cela avec c ++ (je le réapprends et les problèmes rencontrés sont un bon support d'apprentissage / de recherche)

#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;
}

La fonction countNums est utilisée pour descendre ou en diagonale. J'ai testé cette fonction comme suit:

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;

Et ça marche (j'ai aussi légèrement changé la fonction pour qu'elle imprime chaque numéro traversé)

Mais je n’obtiens toujours pas le bon résultat. Cela descend et à droite et va toujours à droite (numéros adjacents à droite), descend et continue à descendre (numéro adjacent à gauche). Qu'est-ce que je fais mal ici, n'importe qui?

Alastair: c'est simple

long long unsigned countNums (start_x court, start_y court, tableau court [] [15], taille courte, bool goright, bool goright2);

start_x et start_y sont les coordonnées du tableau tableau est la référence au tableau la taille est juste la taille du tableau (c'est toujours 15) nuit est de savoir si je vais aller à droite ou à droite goright2 est de savoir si je vais continuer à descendre ou aller à gauche

Était-ce utile?

La solution

Ok, pour commencer, je ne sais pas trop quel est selon vous le problème. Je ne peux pas du tout analyser cette dernière phrase ...

Deuxièmement, vous voudrez peut-être repenser votre conception ici. Pensez aux fonctions qui exécutent une seule tâche discrète et ne sont pas liées au reste de l'application (c'est-à-dire, lisez-la sur & "; Sont étroitement couplées et faiblement liées &"). Pour moi, la présence d'un nom de fonction trop générique countNums avec une longue liste d'arguments est un gros signal d'alarme.

Je pense que si vous divisiez le problème en morceaux plus petits, plus faciles à comprendre, les problèmes seraient beaucoup plus faciles à trouver. Je connais l'approche que je choisirais ici, mais je suppose que le but de l'exercice est de vous aider à mettre en pratique vos compétences en programmation. Je vais donc en rester là.

Autres conseils

J'ai résolu ce problème. Étant donné la nature du projet, Euler est de résoudre le problème vous-même (& "Copier un mot-clé résolu ne signifie pas que vous l'avez résolu &") Et que je ne veux pas gâcher cela pour quelqu'un. sinon, tout ce que je peux vraiment dire, c’est que votre solution semble trop complexe.

Vous pouvez toutefois résoudre ce problème en lisant le fichier. Résolvez-le de cette façon et le problème 69 sera un jeu d'enfant!

Bonne chance!

Je suis un peu confus par le problème ..
Je commencerais par nettoyer votre code.

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;
 }

Maintenant, j'ai lu la question et je ne suis pas sûr que cela fasse ce que vous voulez. Puisque ce n'est pas ce que vous voulez, je suggérerais d'abord de coder par psud. Oubliez le code .. Quelle est la réponse dans le code sudo.
Oh et pour l'amour de tout ce qui est saint. Ne mettez pas plus d'un initialiseur dans la boucle for. Je sais que je vais me faire prendre pour cela, mais c'est compliqué et vraiment inutile. Vous pourriez envisager une fonction de récusation. Semble idéal pour ce problème.

La fonction principale vérifie qu'une entrée n'est pas nulle, mais l'autre fonction qu'elle appelle ne vérifie pas cette entrée même si elle modifie à nouveau l'index. Je ne sais pas, je ne comprends pas vraiment ce que vous essayez de faire.

Je vois la taille du tableau 15 pour 15 éléments, l’index de déclaration commencerait-il également à 0? Laissez-moi vérifier pendant une seconde. Assurez-vous juste, déclaré avec la taille mais accédé basé sur 0. Bon.

Pourquoi avez-vous utilisé un emplacement imbriqué pour les instructions, mais une condition conditionnée pour une instruction ultérieure? Mieux vaut vérifier que le && n’a pas une priorité plus élevée que le <. Le groupe 8 bat le groupe 13 ici . Incrémenter l'opérateur non utilisé plusieurs fois dans une instruction, c'est bien.

On dirait que vous avez déjà résolu ce problème dans une autre langue. Pourriez-vous également tracer la question et trouver l’emplacement de votre nouveau programme qui diffère en premier?

Les autres gars ont raison, la question est confuse. Je voudrais d’abord essayer de résoudre le problème qui consiste à construire des sous-scores dans une autre matrice, en donnant le score le plus élevé si la pyramide a commencé à ce moment-là, et de le construire de la rangée inférieure au sommet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top