Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 22
1

Дано дерево глубины N, каждая внутренняя вершина которого имеет

21.10.2012, 13:34. Показов 3919. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дано дерево глубины N, каждая внутренняя вершина которого имеет 3 непосредственных потомка: А с весом 1, В с весом 0 и С с весом (- 1). Корень дерева D имеет вес 0. Найти все пути от корня к листьям, удовлетворяющие следующим условиям: никакие соседние элементы пути не обозначаются одной и той же буквой, а суммарный вес всех элементов пути равен 0. Перебирать пути, начиная с «самого левого» и заканчивая «самым правым».

Через рекурсию сделать получилось. Нужно сделать программу без использования рекурсии.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2012, 13:34
Ответы с готовыми решениями:

Дано упорядоченное дерево глубины N (N > 0 — четное)
Здравствуйте, нужна помощь с задачкой по программированию. Дано упорядоченное дерево глубины N (N...

Дано n целых чисел, найти среди них число, у которого первая цифра имеет максимальное значение
дано n целых чисел найти среди них число у которого первая цифра имеет максимальное значение.(...

Дано предложение. Посчитать сколько раз в него входит каждая буква алфавита и каждая цифра
Здраствуйте Как вы поняли задание такое: Дано предложение. Посчитать сколько раз в него входит...

Как вывести бинарное дерево неограниченной глубины в браузер
Всем привет! Такой вопрос как вывести бинарное дерево неограниченной глубины в браузер? Знаю нужно...

5
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
25.10.2012, 14:28 2
Поскольку я ленив, делать свой класс стека не стал, воспользовался готовым:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
uses System.Collections.Generic;
 
type
   Tst =
   record
      level : Integer;
      sum : Integer;
      s : string;
   public
      constructor Create(_level : Integer; _sum : Integer; _s : string);
      begin
         Self.level := _level;
         Self.sum := _sum;
         Self.s := _s;
      end;
   end;
   
var
   myStack : System.Collections.Generic.Stack<Tst>;
   
procedure Walk(n : Integer);
const
   Letters : array[-1 .. 1] of Char = ('C', 'B', 'A');
begin
   myStack := new System.Collections.Generic.Stack<Tst>;
   myStack.Push(new Tst(1, 0, ''));
   while myStack.Count > 0 do
   begin
      with myStack.Pop do
         if level = n then
         begin
            if sum = 0 then writeln(s)
         end
         else
            for var i := -1 to 1 do
               if (s = '') or (s[Length(s)] <> Letters[i]) then
                  myStack.Push(new Tst(level + 1, sum + i, s + Letters[i]));
   end;  
end;
 
var
   n : integer;
begin
   readln(n);
   walk(n);
end.
Результаты абсолютно аналогичные тем, которые получаются с использованием рекурсивной процедуры, которую я тебе показывал раньше.
1
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 22
25.10.2012, 16:04  [ТС] 3
я извиняюсь, но можно ли сделать эту задачу но без использования конструктора, т.е. обычные функции, просто мы такое не проходили (конструкторы, record,public - незнаю что это такое.) так же не знаю что такое "класс стека".
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
25.10.2012, 16:16 4
Без записей (Record) - однозначно нет. Для того, чтобы реализовать итеративный обход дерева, надо пользоваться стеком. Тебе в любом случае придется это реализовывать. Если не готовое, что уже есть из коробки (в System.Collections.Generic), то нужен свой велосипед. Но если этот велосипед можно сделать на обычных функциях, то саму структуру, которая в стеке должна храниться, надо же как-то описывать? Как ты это будешь делать без Record-ов?

В общем, задача опять сводится к тому, "как максимально усложнить и написать очередной г...код, только не использовать возможности языка". А потом начинаются вопросы, а почему Паскаль - такой отстой... Да вот по этому и отстой, что пишут на нем непонятно как... Это не используй, то не проходили...
1
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 22
25.10.2012, 16:28  [ТС] 5
просто мы такое не проходили, а препод задал мне задачу эту сделать с рекурсией и без.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32830 / 21168 / 8147
Регистрация: 22.10.2011
Сообщений: 36,429
Записей в блоге: 8
26.10.2012, 15:16 6
Вот так вашего преподавателя устроит?

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
const
   maxDepth = 100;
var
   stackPos : Integer;
   level : array[0 .. maxDepth - 1] of Integer;
   sum : array[0 .. maxDepth - 1] of Integer;
   s : array[0 .. maxDepth - 1] of String;
   
procedure InitStack;
begin
   stackPos := -1;
end;
 
function Push(_level, _sum : Integer; _s : String) : Boolean;
begin
   Inc(stackPos);
   if stackPos < maxDepth then
   begin
      level[stackPos] := _level;
      sum[stackPos] := _sum;
      s[stackPos] := _s;
      Push := true;
   end
   else Push := false;
end;
 
function Pop(var _level, _sum : Integer; var _s : String) : Boolean;
begin
   if stackPos > -1 then
   begin
      _level := level[stackPos];
      _sum := sum[stackPos];
      _s := s[stackPos];
      Dec(stackPos);
      Pop := True;
   end
   else Pop := False;
end;
   
procedure PWalk(n : Integer);
const
   Letters : array[-1 .. 1] of Char = ('C', 'B', 'A');
var
   currLevel, currSum : Integer; currS : String;
   i : Integer;
begin
   InitStack;
   Push(1, 0, '');
   while stackPos > -1 do
   begin
      Pop(currLevel, currSum, currS);
      if currLevel = n then
      begin
         if currSum = 0 then writeln(currS);
      end
      else
         for i := -1 to 1 do
            if (currS = '') or (currS[Length(currS)] <> Letters[i]) then
               Push(currLevel + 1, currSum + i, currS + Letters[i]);
   end;
end;
 
var
   n : integer;
begin
   readln(n);
   pwalk(n);
end.
Или теперь выяснится, что вы и массивы не проходили? Или процедуры/функции?
0
26.10.2012, 15:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.10.2012, 15:16
Помогаю со студенческими работами здесь

Вывести матрицу смежности графа заданного ребрами вершина-вершина
Простой неориентированный граф задан списком ребер, выведите его представление в виде матрицы...

Вывести матрицу смежности графа, заданного ребрами вершина-вершина
Простой неориентированный граф задан списком ребер, выведите его представление в виде матрицы...

Деревья. Cформировать дерево Т и присвоить параметру Е элемент из самого левого листа (лист - вершина, из которой не выходит не одной ветки).
2.4.3. Деревья. Cформировать дерево Т и присвоить параметру Е элемент из самого левого листа (лист...

Сформировать дерево и проверить, входит ли в него вершина с ключом "S"
Сформировать дерево и проверить, входит ли в него вершина с ключом &quot;S&quot;. Ключи(буквы латинского...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru