Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> дерево с тремя детьми 
:(
    Опции темы
Chameleon
Дата 5.12.2005, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.11.2005
Где: moscow

Репутация: нет
Всего: нет



в универе дали одно задание, после недолгих раздумий пришел к выводу smile что надо строить дерево с 3 детьми, но определееного вида
Код

                 ____0_____
                /     |    \
               1     2     3
           /   |  \  ...    ...
          1   2   3

главное условие чтобы сумма всех узлов от листа до корня не превышала заданного N
мучаюсь уже не один день smile , неполучается правильно поставить условия выхода из рекурсии smile
smile ПАМАГИТЕ smile
PM MAIL WWW ICQ   Вверх
DeadSoul
Дата 5.12.2005, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Chameleon, дерево должно быть сортированным?


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Chameleon
Дата 5.12.2005, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.11.2005
Где: moscow

Репутация: нет
Всего: нет



структура узла четкая: первый потомок =1, второй =2, третий=3, как на "рисунке"
PM MAIL WWW ICQ   Вверх
DeadSoul
Дата 5.12.2005, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Кроме этого ограничения есть?


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Chameleon
Дата 5.12.2005, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.11.2005
Где: moscow

Репутация: нет
Всего: нет



нет, самое главное условие это сумма всех узлов от листа до корня, который =0 непревосходит N
PM MAIL WWW ICQ   Вверх
Mephistopheles
Дата 5.12.2005, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегущий от света
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 15.11.2005
Где: Где нет света

Репутация: нет
Всего: 6



В чём прблема-то? Переходишь на след. узел(кстати что под этим подразумевается), увеличиваешь переменную на единицу и сравниваешь.
--------------------
Ангелы и бесы кружат надо мной.Ангел или бес - делай выбор свой.Вспыхнуть огнём; вознестись до небесДелай выбор свой: ангел или бес?© Mephistopheles, бегущий от света.
PM MAIL WWW ICQ   Вверх
S.A.P.
Дата 5.12.2005, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 9
Всего: 71



Chameleon у каждого узла должно быть строго 3 ветки или просто до 3-х веток?
PM MAIL   Вверх
Chameleon
Дата 5.12.2005, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.11.2005
Где: moscow

Репутация: нет
Всего: нет



до 3-х
еслм N=3 то надо получить
Код

                    0
       __  /      |          \
     1            2          3
    /  \         /
   1   2        1
   /
  1

и еще одно небольшое дополнение не столь важное в в узлах должет быль указатель на предка, а не толко на потомка
PM MAIL WWW ICQ   Вверх
S.A.P.
Дата 5.12.2005, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 9
Всего: 71



Я совсем запутался smile .

Цитата(Chameleon @ 5.12.2005, 00:36)
главное условие чтобы сумма всех узлов от листа до корня не превышала заданного N
это я понимаю как сумма ВСЕХ улов.

Цитата

если N=3 то надо получить


                    0
      __  /      |          \
    1            2          3
    /  \        /
  1  2        1
  /
  1


а это я уже понимаю - количество уровней + 1. А сумма узлов тут - 8.

Что ты понимаешь под N? Сумму узлов или количество уровней?
PM MAIL   Вверх
SDenis
Дата 5.12.2005, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 3.12.2005

Репутация: нет
Всего: нет



А почему нельзя хранить в каждом узле "сумму " полученную на всех предыдущих узлахsmile)? тогда выход весьма прост -- если полученная на данном узле сумма большеравна какому то пороговому значению узел не создаетсяsmile)) Затраты тоже 4 байтовое число на узелsmile)(как и указатель на предка)
PM MAIL   Вверх
Chameleon
Дата 5.12.2005, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.11.2005
Где: moscow

Репутация: нет
Всего: нет



Цитата
А почему нельзя хранить в каждом узле "сумму " полученную на всех предыдущих узлах

можно я уже пытался реализовать, но еще надо печатать путь(по узлам) от листьев до корня, тут какрас и нужна ссылка на предка, а сами лисьтя внести в некий линейный список(отдельный). как листья внести в список я проедставляю, но как само дерево строиться не могу втыкнуть smile smile smile
Цитата
Что ты понимаешь под N? Сумму узлов или количество уровней?

количество уровней действительно N+1,но сумма пути по узлам от всех ЛИСТЬЕВ до корня=N. если взять любой лист то сумма узлов до корня =N. корень = 0 птому что так путь не увеличивается, увеличивается только кол-во уровней.

сам уже путаться стал вот условие моего задания: по лестнице прыгает мячик, мячик за один прыжок может перепрыгнуть на 1-у, 2-е или 3 ступеньки. необходимо подсчитать количество всех возможных прыжков и распечатать их на экран
PM MAIL WWW ICQ   Вверх
S.A.P.
Дата 6.12.2005, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 9
Всего: 71



Тут дерево строить не надо, в памяти надо хранить текущий список, который будет формироваться в процессе перебора. Вот решение
Код

#include <iostream>

using namespace std;

const int num_steps = 6; // количество ступенек
const int step_len = 3; // максимальная длина прыжка
int steps_log[num_steps] = {0}; // лог прыжков

void jump( int depth, int step )
{
    // если допрыгали до конца, распечатать лог
    if ( step == 0 ) {
        for ( int i = 0; i < num_steps; i++ )
            if ( steps_log[i]!=0 ) cout << steps_log[i];
        cout << endl;
    }
    
    // перебирать возможные прыжки
    for ( int i = 1; i <= step_len && step-i >= 0; i++ ) {
        steps_log[depth] = i; // записать прыжок в лог
        jump( depth + 1, step - i ); // прыгать дальше
    }
    steps_log[depth] = 0; // убрать из лога
}    

int main( int argc, char *argv[] )
{
    jump( 0, num_steps );
    system( "PAUSE" );
    return EXIT_SUCCESS;
}

PM MAIL   Вверх
Chameleon
Дата 15.12.2005, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.11.2005
Где: moscow

Репутация: нет
Всего: нет



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

введите длинну лестници: 3
111
12
21
3
колличество всевозможных прыжков по лестнице 4
*** glibc detected *** free(): invalid next size (fast): 0x09bfd008 ***
Aborted


а при четной длинне все нрмально
bash-3.00$ ./s.out
введите длинну лестници: 2
11
2
колличество всевозможных прыжков по лестнице 2


PM MAIL WWW ICQ   Вверх
blackofe
Дата 15.12.2005, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Цитата(Chameleon @ 15.12.2005, 14:09)
спасибо за программу, работает прнкрасно, тока есть какойто баг который я не пойму откуда идет
если длинна лога нечетная то при освобождение памяти терминал ругается

введите длинну лестници: 3
111
12
21
3
колличество всевозможных прыжков по лестнице 4
*** glibc detected *** free(): invalid next size (fast): 0x09bfd008 ***
Aborted

у меня VC2003 такую ошибку не дает ( smile ), но мне кажется, имеется проблемное место:

Код

void jump( int depth, int step )
{
    // если допрыгали до конца, распечатать лог
    if ( step == 0 ) {
        for ( int i = 0; i < num_steps; i++ )
            if ( steps_log[i]!=0 ) cout << steps_log[i];
        cout << endl;
        // здесь я бы поставил return
        return; // см. строчку steps_log[depth] = 0; // убрать из лога
    }
    
    // перебирать возможные прыжки
    for ( int i = 1; i <= step_len && step-i >= 0; i++ ) {
        steps_log[depth] = i; // записать прыжок в лог
        jump( depth + 1, step - i ); // прыгать дальше
    }
    // вот здесь возможна некорректная работа с памятью, если depth равен размерности массива
    steps_log[depth] = 0; // убрать из лога
}    

PM MAIL   Вверх
S.A.P.
Дата 15.12.2005, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 9
Всего: 71



Цитата(blackofe @ 15.12.2005, 19:08)
но мне кажется, имеется проблемное место:
ага, есть такое дело. +

Добавлено @ 20:35
Chameleon замени функцию jump на ту, что дал blackofe.
PM MAIL   Вверх
Chameleon
Дата 16.12.2005, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.11.2005
Где: moscow

Репутация: нет
Всего: нет



ага было такое дело, массив на 1 длянне создал и все нормально стало
PM MAIL WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1179 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.