Frage

Ich bin versucht zu lösen Euler Problem 18 -> http://projecteuler.net/index.php?section=problems&id=18

Ich bin versucht, dies mit c++ (ich bin umlernen und euler-Probleme sorgen für gute Lern - /Suche nach material)

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

Die countNums-Funktion verwendet wird, gehen entweder nach unten oder Diagonal.Ich habe getestet dieser Funktion etwa so:

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;

Und es funktioniert (ich habe auch die Funktion ein wenig, damit es drucken würde jede Anzahl, es werde durch)

Aber ich habe noch nicht das richtige Ergebnis.Dies geht nach unten und nach rechts und geht noch Recht (neben den zahlen auf der rechten Seite), geht nach unten und immer weiter nach unten (neben der Anzahl der Links).Was mache ich hier falsch, wer?


Alastair:Es ist ganz einfach

long long unsigned countNums(kurz start_x,kurze start_y,kurz array[][15],kurze Größe, bool goright,bool goright2);

start_x und start_y sind die Koords des Arrays array ist eine Referenz auf das array die Größe ist nur die Größe des Arrays (es ist immer 15) goright ist zu wissen, ob ich gehe nach rechts und nach unten oder nur nach unten goright2 ist zu wissen, ob ich weiter nach unten gehen oder nach Links

War es hilfreich?

Lösung

Ok, so first off, ich bin ein wenig unklar, was Sie denken, das problem ist.Ich kann nicht analysieren, die zweite-den letzten Satz überhaupt...

Zweitens möchten Sie vielleicht zu überdenken Ihre design-hier.Denken Sie über die Funktionen, die Sie durchführen, einen einzigen diskreten Aufgabe und sind nicht eng mit dem rest der Anwendung (dh Lesen, auf "eng gekoppelte und lose gebunden").Für mich eine große Alarmglocke, hier ist die Anwesenheit eines übermäßig-generic function name countNums mit einer langen Liste von Argumenten.

Ich denke, wenn Sie teilen das problem in kleine, leicht verständliche Stücke, die Sie finden, könnten die Probleme viel leichter zu finden.Ich kenne den Ansatz, den ich nehmen würde, hier, aber ich gehe davon aus, dass der ganze Punkt der übung ist, zu helfen Sie übung Ihre Programmierung Fähigkeiten, so werde ich lass es einfach auf, dass...

Andere Tipps

Ich habe dieses problem gelöst.Angesichts der Natur des Project Euler zu lösen die problem auf Ihre eigene ("Fotokopiereinrichtungen ein Problem gelöst Kreuzworträtsel bedeutet nicht, dass Sie es gelöst") und dass ich nicht wollen, ruinieren diese für jemand anderen habe, kann ich wirklich sagen, dass Sie Ihre Lösung sieht übermäßig Komplex.

Sie können jedoch dieses problem lösen, da Sie das Lesen der Datei.Lösen Sie auf diese Weise-und problem - #69 wird ein Kinderspiel!

Viel Glück!

Ich bin ein wenig verwirrt von dem problem..
Ich würde beginnen Sie mit der Reinigung bis in Ihren code ein.

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

Jetzt lese ich die Frage und ich bin mir nicht sicher, ob es das tut, was Sie wollen.Da dies nicht das ist, was Sie wollen, ich würde vorschlagen, psudo-code der Antwort zunächst.Den code vergessen..Was ist die Antwort in der sudo-code.
Oh, und für die Liebe von allem, was heilig ist.Setzen Sie nicht mehr als einen Initialisierer in der for-Schleife.Ich weiß, ich werde bekommen flak für die, aber es ist chaotisch und nicht wirklich nötig.Etwas, das Sie vielleicht erwägen, ist eine recusive Funktion.Ideal zu sein scheint für dieses problem.

Die main-Funktion die überprüft ob ein Eintrag nicht null, aber die andere Funktion, die Sie aufruft, nicht überprüfen, auch wenn es änderungen des index wieder.Ich weiß nicht, ich weiß nicht wirklich verstehen, was Sie versuchen zu tun.

Ich sehe array-Größe 15 für 15 Elemente, würde der index für die Erklärung auch bei 0 beginnen?Lassen Sie mich überprüfen für eine Sekunde.Nur machen sicher, erklärt der Größe, sondern auf die zugegriffen wird basierend auf 0.Gut.

Warum verwenden Sie eine geschachtelte for-Anweisungen an einem Ort, sondern eine compunded-Bedingung für die Aussage später auf?Besser überprüfen Sie, dass die && nicht haben höhere Priorität als die <.Gruppe 8 beats aus Gruppe 13 hier.Inkrement-operator nicht verwendet, der mehrmals in einer Erklärung, das ist gut.

Es klingt wie Sie dies getan haben problem, bevor Sie in einer anderen Sprache, konnte Sie eine Spur auf, die zu und finden den Ort Ihres neuen Programms zunächst unterscheidet?

Die anderen Jungs sind richtig, die Frage ist verwirrend.Ich würde zuerst versuchen, das problem zu lösen, kaufen Gebäude bis Teilbewertungen in eine andere matrix zu geben Sie die höchste Punktzahl, wenn die Pyramide begann an diesem Punkt an und bauen es von der unteren Zeile nach oben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top