Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Алфавит в треугольнике


Автор: Сый 7.5.2006, 20:04
Даётся такой вариант построения букв алфавита:
Код
       А       
      У Б      
     Т Ф В     
    С Я Х Г    
   Р Ю   Ц Д   
  П Э     Ч Е  
 О Ь Ы Ъ Щ Ш Ё 
Н М Л К Й И З Ж

Нужен наиболее красивый алгоритм для такого его вывода. 

Автор: SoWa 7.5.2006, 20:23
Думаем...
По моему- решать только с помощью матрицы. Перемещением по ней на одну клетку по диагонали или горизонтали.
Ты её ограничь и потом на каждом шаге проверяй, не натолкнулся ли на край. Натолкнулся- поворачивай. 
Можно упростить задачу- не проверять столкновения со стенами, а заранее посчитать сколько букв в каждом ряду и поворачивать, когда в ряду будет именно столько букв. 

Автор: Fin 7.5.2006, 20:34
В С++ будет примерно такой алгоритм:
Код

#include <iostream.h>
int main()
{
   cout << "       А" << endl       
          << "      У Б" << endl      
          << "     Т Ф В"<< endl     
          << "    С Я Х Г"<< endl    
          << "   Р Ю   Ц Д"<< endl   
          << "  П Э     Ч Е"<< endl  
          << " О Ь Ы Ъ Щ Ш Ё"<< endl 
          << "Н М Л К Й И З Ж"<< endl;
   return 0;
}

Быстрее и меньше по размерам не придумаеш.  

Автор: SoWa 7.5.2006, 20:48
Так в чем фишка- надо именно алгоритм, а не вывод на экран. 

Автор: Сый 7.5.2006, 20:54
Fin, ну мне же не нужна просто функция вывода на экран текста.

SoWa, надо попробовать, я уже думал над таким вариантом. Двухмерный ряд с координатами, счётчик букв, задача для изменения координат в соответствие с текущим направлением. Во внешнем треугольнике в стороне по 7 букв, во внутреннем - по 4. 

Автор: SoWa 7.5.2006, 20:57
Попробуй. Собственно- другие вариации, мне кажется, будут мене рациональными. 

Автор: MBo 8.5.2006, 07:51
Код

procedure TForm1.Button2Click(Sender: TObject);
const
  Alphabet = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
  ddx: array[0..2] of Integer = (8, -16, 8);
  ddy: array[0..2] of Integer = (-16, 0, 16);
var
  i, j, k, l, x, y: Integer;
begin
  l := Length(Alphabet);
  x := 120;
  y := 20;
  Canvas.Font.Name := 'Courier New';
  k := 1;
  for i := 8 downto 1 do begin
    for j := 1 to i do begin
      x := x + ddx[i mod 3];
      y := y + ddy[i mod 3];
      Canvas.TextOut(X, Y, Alphabet[k]);
      Inc(k);
      if k > l then
        Exit;
    end;
  end;
end;

 

Автор: SoWa 8.5.2006, 08:48
Работает. Плюс за не лень smile 

Автор: Сый 8.5.2006, 08:50
Ага, работает. Спасибо.
Вот этот код на Глаголе:
Код

ЗАДАЧА Треугольник(); 
ПЕР 
  i, j, k, x, y: ЦЕЛ; 
  Алфавит: ЦЕПЬ[33+1]; 
  ddx, ddy: РЯД 3 ИЗ ЦЕЛ; 
  Буква: ЦЕПЬ[1]; 
УКАЗ 
  ddx[0]:=1; ddx[1]:=-2; ddx[2]:=1; 
  ddy[0]:=-1; ddy[1]:=0; ddy[2]:=1; 
  Алфавит := 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'; 
  x := 10; y := 5; 
  k := 0; 
  ОТ i := 8 ДО 1 ПО -1 ВЫП 
    ОТ j := 1 ДО i ВЫП 
      x := x + ddx[i ОСТАТОК 3]; 
      y := y + ddy[i ОСТАТОК 3]; 
      Буква[0] := Алфавит[k]; Вывод.ВПрямоуг(x, y, x, y, Буква); 
      УВЕЛИЧИТЬ(k); ЕСЛИ k >= 33 ТО ВОЗВРАТ КОН 
    КОН 
  КОН 
КОН Треугольник;
  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)