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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2009, 20:04   #1
V@mpir
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 54
По умолчанию Зеркальное отражение

Доброго времени! Нужна помощь. Есть некая последовательность чисел, например 12321, её можно назвать симметричной, так как она читается с лева направо и с право налево одинаково.
Программе задаётся последовательность чисел, требуется определить минимальное количество и каких чисел надо приписать в конце этой последовательности, что бы она стала симметричной.
В входном файле дано количество элементов исходной последовательности и далее дана сама "недостроенная" последовательность.
Прошу помочь реализовать! Заранее спасибо!
V@mpir вне форума Ответить с цитированием
Старый 15.09.2009, 20:44   #2
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Весь код писать, думаю, не стоит. Вот, что мне сразу же в голову пришло:
Код:
var s : array of integer;
    t : array of integer;
i, j : integer;
...
//s и t имеют одинаковую размерность, считанную из файла
j := 0;
s[0] := 0;
t[0] := 0;
for i := 1 to sizeof(s) - 1 do
  begin
    if ( s[i] = s[t[i-1]-1] ) then
      begin
        t[i] := t[i-1] + 1;
      end
    else
      begin
        t[i] := 0;
      end;
  end;
Но этот участок кода поможет определить только лишь симметричную последовательность вот такого вида: 123321. В итоге получится, что минимальное количество символов, которые нужно дописать есть значение последнего элемента массива t. Ну, какие символы дописать, думаю, проблем не должно возникнуть найти. Просто раскрутите последовательность в обратном порядке с символа sizeof(s)-t[sizeof(t)-1].
Для последовательности вида 12321 код таков:
Код:
j := 0;
  s[0] := 0;
  t[0] := 0;
  s[1] := 1;
  t[1] := 1;
  for i := 2 to sizeof(s) - 1 do
  begin
    if ( s[i] = s[t[i-1]-2] ) then
      begin
        t[i] := t[i-1] + 1;
      end
    else
      begin
        t[i] := 1;
      end;
  end;
Ответ на поставленный вопрос аналагичен тому, что соответствует другому коду. Как это соединить в единое целое пока нет мыслей. В любом случае, решить задачу можно и имея два предыдущих отрывка кода. Если не заработает или нужны пояснения, обращайтесь.
mMAg вне форума Ответить с цитированием
Старый 15.09.2009, 21:48   #3
V@mpir
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 54
По умолчанию

Последовательность может быть абсолютной любой. Состоять из всех натуральных чисел и иметь самый разнообразный состав. Спасибо за части кода, но саму логику, алгоритм (а он должен быть естественно универсальным, и результат должен быть независимо от вариация последовательности) я понять к сожалению не смог.
V@mpir вне форума Ответить с цитированием
Старый 15.09.2009, 22:27   #4
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Логика вот такая:
Первый кусок кода:
Предполагаю, что у меня есть массив символов, мне нужно определить минимальное количество символов, необходимое для того, чтобы дописав их в конец, у нас получилось симметричное число.
Завожу вспомогательный массив, в котором буду подсчитывать текущее количество символов, которое не нужно дописывать для того, чтобы число стало симметричным. Например, есть число 1231331.
Тогда первых пять членов массива есть нули. Шестой 1. Седьмой 2. Т.е. 31 как бы уже не должны дописываться справа. Если появляется символ, который рушит идиллию, например 12313312, если, то естественно счетчик хороших чисел обнуляется.
Второй кусок кода для чисел вида 123.
Т.е. считается, что я не должен делать число 123321, а должен сделать число 12321. Поэтому соответствующие элементы массива заполняются не 0, а 1. Т.е. хороших чисел по дефолту одно. Ну а дальше логика такая же, как и в предыдущем случае. Т.е 1232, для последней двойки в силу ее симметричности относительно 3 счетчик увеличивается, т.е. будет 2.
Извините за сумбурное описание.
Надеюсь, поймете.
mMAg вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отражение луча Illusionist Общие вопросы Delphi 3 30.05.2009 23:20
Отражение рисунка от стенок Надежда.. Мультимедиа в Delphi 14 20.12.2008 23:24
Зеркальное отображение элементов матрицы в паскале SEREG@ Помощь студентам 12 12.09.2008 15:54