2008-11-17 11 views
0

Je suis en train de résoudre Euler problème 18 ->http://projecteuler.net/index.php?section=problems&id=18problème Triangle

Je suis en train de le faire avec C++ (je réappris et problèmes euler faire un bon apprentissage/matériel 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 aller vers le bas ou en diagonale. J'ai testé cette fonction comme ceci:

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 il fonctionne (j'ai aussi changé la fonction un peu il imprimerait chaque numéro qu'il traversait)

Mais je ne comprends toujours pas le bon résultat. Cela descend et vers la droite et continue toujours à droite (numéros adjacents à droite), descend et continue à descendre (numéro adjacent à gauche). Qu'est-ce que je fais de mal ici, quelqu'un?


Alastair: Il est simple

longues longues COUNTNUMS non signés (court, court start_x start_y, tableaux courts [] [15], la taille courte, bool goRight, bool goright2);

start_x et start_y sont les coords du tableau tableau est la référence à la taille tableau est juste la taille du tableau (il est toujours 15) goRight est de savoir si je vais aller vers le bas et à droite ou juste goright2 est de savoir si je vais continuer à descendre ou à gauche

Répondre

3

Ok donc d'abord, je ne sais pas très bien ce que vous pensez que le problème est. Je ne peux pas analyser cette dernière phrase du tout ...

Deuxièmement, vous pourriez vouloir repenser votre conception ici. Pensez aux fonctions qui exécutent une seule tâche discrète et qui ne sont pas liées au reste de l'application (c'est-à-dire qui se lisent sur «étroitement couplé et faiblement lié»). Pour moi une grosse cloche d'avertissement ici est la présence d'un nom de fonction trop générique countNums avec une longue liste d'arguments.

Je pense que si vous divisiez le problème en fragments plus petits, plus facilement compréhensibles, vous pourriez trouver les problèmes beaucoup plus faciles à trouver. Je connais l'approche que je prendrais ici, mais je suppose que tout le but de l'exercice est de vous aider à pratiquer vos compétences en programmation, alors je vais m'en tenir à cela ...

0

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 qu'il fasse ce que vous voulez. Puisque ce n'est pas ce que vous voulez, je suggèrerais d'abord psudo-code. 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 avoir des flaks pour ça, mais c'est désordonné et vraiment pas nécessaire. Quelque chose que vous pourriez considérer est une fonction de recusive. Semble idéal pour ce problème.

+0

int j = 1; pour (int i = 0; i baash05

0

La fonction principale vérifie qu'une entrée n'est pas nulle, mais l'autre fonction qu'elle appelle ne la vérifie pas même si elle modifie de 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 pour la déclaration commence-t-il également à 0? Laissez-moi vérifier une seconde. Juste s'assurer, déclaré avec la taille mais accessible en fonction de 0. Bon.

Pourquoi avez-vous utilisé une instruction imbriquée pour un endroit, mais une condition pour une instruction conditionnée plus tard? Il vaut mieux vérifier que le && n'a pas une plus grande priorité que le <. Le groupe 8 surclasse le groupe 13 here. L'opérateur d'incrémentation n'est pas utilisé plusieurs fois dans une instruction, c'est bien.

Il semblerait que vous ayez déjà fait ce problème dans une autre langue, pourriez-vous également faire une trace de ce problème et trouver l'endroit où votre nouveau programme diffère?

Les autres gars ont raison, la question est confuse. J'essaierais d'abord de résoudre le problème de l'accumulation de sous-scores dans une autre matrice donnant le score le plus élevé si la pyramide commençait à ce point et la construisait de la rangée du bas vers le haut.

1

J'ai résolu ce problème. Compte tenu de la nature du Projet Euler est de résoudre le problème par vous-même ("photocopier un puzzle résolu ne signifie pas que vous l'avez résolu") et que je ne veux pas le gâcher pour quelqu'un d'autre, tout ce que je peux dire c'est que votre solution semble trop complexe.

Vous pouvez cependant résoudre ce problème pendant la lecture du fichier. Résolvez-le de cette façon et le problème # 69 sera un jeu d'enfant!

Bonne chance!