سؤال

وأنا أحاول أن حل مشكلة يولر 18 -> http://projecteuler.net /index.php؟section=problems&id=18

وأنا أحاول أن تفعل هذا مع c ++ (أنا إعادة التعلم هو والمشاكل يولر لجعل التعلم الجيد / بحث المواد)

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

ويتم استخدام الدالة countNums للذهاب إما أسفل أو قطريا. لقد اختبرت هذه الوظيفة مثل ذلك:

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;

وأنه لا عمل (أود أيضا أن تغير وظيفة قليلا لذلك سيكون طباعة كل عدد كان يمر)

ولكن ما زلت لا تحصل على النتيجة الصحيحة. وهذا ينطبق إلى الأسفل وإلى اليمين ولا يزال يذهب (أرقام المجاورة إلى اليمين) الصحيحة، وتنخفض وتحافظ على نزول (عدد المجاورة إلى اليسار). ماذا أفعل الخطأ هنا، أي شخص؟


واليستر: انها بسيطة

وطويلة countNums غير موقعة طويلة (start_x باختصار، start_y باختصار، مجموعة قصيرة [] [15]، حجم قصيرة، منطقي goright، منطقي goright2)؛

وstart_x وstart_y هي احداثيات للمجموعة مجموعة هي إشارة إلى مجموعة حجم هو مجرد حجم المصفوفة (هو دائما 15) goright هو معرفة ما إذا كنت ذاهب للذهاب إلى أسفل واليمين أو فقط بانخفاض goright2 هو معرفة إذا أنا ذاهب إلى الاستمرار في النزول أو الذهاب اليسار

هل كانت مفيدة؟

المحلول

وطيب حتى أولا، أنا غير واضحة قليلا على ما كنت تعتقد أن المشكلة هي. أنا لا يمكن تحليل هذه الجملة قبل الأخيرة على الإطلاق ...

وثانيا قد ترغب في إعادة التفكير في التصميم الخاص بك هنا. التفكير في الوظائف التي تؤدي مهمة منفصلة واحدة وليس تتشابك مع باقي التطبيق (أي تقرأ على "المقرونة بإحكام وملزمة فضفاضة"). بالنسبة لي جرس التحذير الكبير هنا هو وجود مفرطة في عام اسم الدالة countNums مع قائمة طويلة من الحجج.

وأعتقد لو كنت لتقسيم المشكلة إلى أصغر حجما وأكثر مفهومة بسهولة، قطع قد تجد المشاكل أسهل كثيرا في العثور عليها. وأنا أعلم أن النهج الذي أود أن أنتهز هنا ولكن أفترض بيت القصيد من هذه العملية هو لمساعدتك على ممارسة مهارات البرمجة الخاصة بك، لذلك أنا مجرد ترك الأمر عند هذا الحد ...

نصائح أخرى

ولقد حل هذه المشكلة. ونظرا لطبيعة مشروع أويلر هو حل المشكلة على الخاص بك ( "التصوير لغز الكلمات المتقاطعة حلها لا يعني أنك حلها") والتي لا تريد أن تدمر هذا لشخص آخر، كل ما يمكنني قوله هو حقا هذا الحل الخاص بك تبدو معقدة للغاية.

ويمكنك، ومع ذلك، حل هذه المشكلة كما كنت تقرأ الملف. حلها بهذه الطريقة والمشكلة رقم 69 سوف يكون نسيم!

وحظا سعيدا!

وأنا مرتبك قليلا من هذه المشكلة ..
كنت أبدأ عن طريق تنظيف التعليمات البرمجية.

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

والآن قرأت السؤال وأنا لست متأكدا من انها تفعل ما تريد. لأن هذا ليس ما تريد أنا أقترح psudo رمز الإجابة أولا. نسيت الرمز .. ما هو الحل في التعليمات البرمجية سودو.
يا ولمحبة كل ما هو مقدس. لا تضع مهيئ أكثر من واحد في لحلقة. أعرف أنني ذاهب للحصول على واقية من الرصاص لذلك، ولكن من الفوضى وحقا لا حاجة. شيء قد تفكر هي وظيفة recusive. يبدو مثاليا لهذه المشكلة.

وتتمثل المهمة الرئيسية يتحقق أن الإدخال غير الصفر، ولكن وظيفة أخرى أنه يدعو لا يتم التحقق من أنه على الرغم من أن يتحول المؤشر مرة أخرى. أنا لا أعرف، أنا لا أفهم حقا ما تحاول القيام به.

وأرى مجموعة حجم 15 لمدة 15 عناصر، فإن مؤشر للإعلان أيضا بدء في 0؟ اسمحوا لي أن تحقق لثانية. مما يجعل مجرد التأكد أعلن مع حجم ولكن القائم قبالة 0. جيد الوصول إليها.

لماذا استخدام المتداخلة لبيانات مكان واحد ولكن شرط compunded للبيان في وقت لاحق؟ تحقق أفضل أن && لا أسبقية أعلى من <. المجموعة 8 يدق من مجموعة 13 هنا . مشغل الاضافة لا تستخدم عدة مرات في بيان، هذا امر جيد.

وهذا يبدو وكأنه كنت قد فعلت هذه المشكلة قبل بلغة أخرى، هل يمكن أن تفعل أي أثر على ذلك أيضا، والعثور على مكان يختلف الأولى برنامج الجديدة؟

والرجال الآخرين على حق، والسؤال هو مربك. وأود أن أول محاولة لإيجاد حل لمشكلة شراء بناء النقاط الفرعية في مصفوفة آخر يعطي على أعلى الدرجات إذا بدأ الهرم في تلك المرحلة وبناء عليه حتى من الصف السفلي إلى الأعلى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top