2008-11-17 2 views
0

Я пытаюсь решить Эйлер проблемы 18 ->http://projecteuler.net/index.php?section=problems&id=18треугольника проблема

Я пытаюсь сделать это с помощью C++ (я переучивание это и проблемы Euler сделать для хорошего обучения/поиска материала)

#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], короткий размер, BOOL goright, BOOL goright2);

start_x и start_y являются Coords массива массива является ссылкой на размер массива только размер массива (это всегда 15) goright должен знать, если я пойду вниз и вправо или just down goright2 должен знать, если я собираюсь продолжать идти или идти

ответ

3

Хорошо, сначала я немного не понимаю, что вы думаете о проблеме. Я не могу разобрать это второе предложение ...

Во-вторых, вы можете подумать о своем дизайне здесь. Подумайте о функциях, которые выполняют отдельную дискретную задачу и не переплетаются с остальной частью приложения (т.е. читайте «тесно связанную и слабо связанную»). Для меня большой предупреждающий звонок здесь - наличие слишком общего имени функции countNums с длинным списком аргументов.

Я думаю, что если бы вы разделили проблему на более мелкие, более понятные, куски, вы могли бы найти проблемы намного легче найти. Я знаю подход, который я возьму здесь, но я предполагаю, что весь смысл упражнения - помочь вам попрактиковаться в своих навыках программирования, поэтому я просто оставлю его на этом ...

0

Я немного путают проблемы ..
Я бы начал с очистки кода.

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-code ответ. Забудьте код .. Каков ответ в коде sudo.
О, и для любви ко всему, что свято. Не помещайте более одного инициализатора в цикл for. Я знаю, что я собираюсь сделать это для этого, но это грязно и действительно не нужно. Что-то, что вы могли бы подумать, - это возвращающая функция. Кажется идеальным для этой проблемы.

+0

int j = 1; for (int i = 0; i baash05 2008-11-17 01:41:45

0

Основная функция проверяет, что запись не равна нулю, но другая функция, которую она вызывает, не проверяет ее, даже если она снова изменяет индекс.Я не знаю, я не совсем понимаю, что вы пытаетесь сделать.

Я вижу размер массива 15 для 15 элементов, будет ли индекс для объявления также начинаться с 0? Позвольте мне проверить секунду. Просто убедитесь, что объявлен с размером, но доступ к нему основан на 0. Хорошо.

Почему вы использовали одно вложенное выражение для операторов в одном месте, кроме того, что это условие для оператора? Лучше проверить, что && не имеет более высокого приоритета, чем <. Группа 8 избивает группу 13 here. Оператор приращения не используется несколько раз в инструкции, это хорошо.

Похоже, вы уже делали эту проблему на другом языке, можете ли вы сделать трассировку на этом тоже и найти место, в котором ваша новая программа отличается в первую очередь?

Другие ребята правы, вопрос запутан. Сначала я попытался бы решить проблему, покупая наращивание подсетей в другой матрице, дающую наивысший балл, если пирамида начнется в этот момент и построит ее с нижнего ряда до вершины.

1

Я решил эту проблему. Учитывая природу Project Euler - решить проблему самостоятельно («фотокопирование решенной кроссворда не означает, что вы ее решили»), и что я не хочу разрушать это для кого-то другого, все, что я действительно могу сказать, это что ваше решение выглядит слишком сложным.

Вы можете решить эту проблему при чтении файла. Решите это так, и проблема № 69 будет ветерок!

Удачи вам!

Смежные вопросы