Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2008, 23:14   #1
JET_FLASH
Пользователь
 
Аватар для JET_FLASH
 
Регистрация: 24.09.2007
Сообщений: 33
По умолчанию Построить дерево в ширину

Помогите с алгоритмом.
Собственно есть строка:
Код:
ABGCF.HDE..IJ
из этого должно выйти:
Безымянный.PNG
Я так понял, A - сам по себе корень, а дальше парами.
"." -нет левого/правого сына.
Как это рисовать понятно, но проблема с алгоритмом.
Да поможет нам F1. Да сохранит нас F2... Аминь
JET_FLASH вне форума Ответить с цитированием
Старый 05.02.2008, 08:35   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот пример построения дерева по похожему с твоим условием
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var s:string;bx,ax,ay,cntx,x,y,i:integer;
begin
s:='123456';   x:=100;y:=100;cntx:=1;
ax:=Width div 2; ay:=10;
for i :=1  to length(s)  do
begin
 with form1.Canvas do
 begin
    bx:=ax-(cntx*100) div 2;
    Ellipse(bx+x-10,ay+y-10,bx+x+10,ay+y+10);
    TextOut(bx+x-5,ay+y-5,s[i]);
 end;
 if (x div 100)=cntx then begin
  x:=100;
  cntx:=cntx+1;
  y:=y+100;
 end else x:=x+100;
end;

end;

end.
ТОлько палки сам рисуй
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.02.2008, 11:48   #3
JET_FLASH
Пользователь
 
Аватар для JET_FLASH
 
Регистрация: 24.09.2007
Сообщений: 33
По умолчанию

Да рисовать и не надо ничего.
Делаю это в консоли на Си.
Мне б как-то на словах сам алгоритм.
Код:
...
...
пока (...)
 {...
  перейти к левому сыну;
  ...
  ...
  создать корень правого поддерева;
  ...
 }
...
...
Да поможет нам F1. Да сохранит нас F2... Аминь
JET_FLASH вне форума Ответить с цитированием
Старый 06.02.2008, 08:18   #4
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Код:
var
type
  TArrCh = array of Char; // Тип - массив букав
  TArrArr = array of TArrCh; // Тип - массив TArrCh

.................................................................

var
  AA: TArrArr; // Переменная AA типа TArrArr
  U: Integer; // Переменная Уровень типа Простое число
  N: Integer; // Переменная Номер типа Простое число
  R: Integer; // Переменная Размер типа Простое число
  i: Integer; // Переменная i типа Простое число

  // Создает новый уровень
  function NewU (): Boolean;
  var
    j: Integer; // Переменная j типа Простое число
    f: Boolean; // Переменная f типа Простое число
  begin
    // Проверяем, не состоит ли текущий уровень AA[U] полностью состоит из '.'
    f := False;
    for j := 0 to Length (AA [U]) - 1 do begin
      if AA [U, j] <> '.' then begin
        f := True;
        Break;
      end;
    end;
    // Если текущий уровень AA[U] полностью состоит из '.', то удалям его. Функция вернет False
    if not f then begin
      SetLength (AA, Length (AA) - 1); // увеличивем размер АА на 1
    end
    // Иначе создаем новый уровень. Функция вернет True
    else begin
       R := R * 2; // увеличивем Размер в 2 раза
       SetLength (AA, Length (AA) + 1); // увеличивем размер АА на 1
       U := U + 1; // увеличивем Уровень на 1
       SetLength (AA[U], R); // задаем размер АА [Уровень] равный Размер
       N := 0; // Номер задаем 0
       // Зарисываем в каждую ячейку уровня '.'
       for j := 0 to Length (AA[U]) - 1 do AA[U,j] := '.';
    end;
    NewU := f;
  end;

begin
  SetLength (Result, 0);

  if AStr = '' then Exit;

  U := 0; // Уровень задаем 0
  SetLength (AA, 1); // Размер AA задаем 1
  SetLength (AA [0], 1); // Размер AA [0] задаем 1
  AA [0,0] := AStr [1]; // AA [0, 0] задаем первую букаву строки
  N := 0; // Номер задаем 0
  R := 1;// Размер задаем 1

  for i := 2 to Length (AStr) do begin // for i от 2-го символа до Конца входной строки
    N := N + 1; // увеличивем Номер на 1
    if N = R then begin // Если Номер = Размер то нужно создать новый уровень
      if not NewU then begin // Если новый уровень не создан то заканчиваем
        Result := AA;
        Exit;
      end;
    end; // конец Если
    // Выполняем цикл пока не дойдем до ячейки, предок которой не равен '.'
    while AA [U-1, (N div 2)] = '.' do begin // Пока АА [Уровень-1, (Номер div 2)] = '.'
      AA [U, N] := '.'; // записываем в AA[Уровень, Номер] '.'
      N := N + 1; // увеличивем Номер на 1
      if N = R then begin // Если Номер = Размер то нужно создать новый уровень
        if not NewU then begin // Если новый уровень не создан то заканчиваем
          Result := AA;
          Exit;
        end;
      end; // конец Если
    end; // конец Пока
    AA [U, N] := AStr [i]; // записываем в AA[Уровень, Номер] i-ую букву входной строки
  end; // Усё

end;
Далее, имея массив AA рисуем его ячейки не равные '.'.
Ахтунг, динамические массивы нумеруются с 0, строки с 1.
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как Firefox рассчитывает ширину столбцов вот в таком случае??? Finer HTML и CSS 3 26.04.2008 16:47
как в стрингриде задавать ширину(высоту) ячеек, а для отдельных строк (столбцов)) sdp Компоненты Delphi 3 20.06.2007 23:02