Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.03.2011, 17:53
overlest overlest вне форума
Прохожий
 
Регистрация: 17.03.2011
Сообщения: 2
Репутация: 10
По умолчанию Помогите с игрой "города"

Всем известна игра в ”города”, когда нужно называть города, первая буква которого совпадает с последней буквой предыдущего. Дано несколько названий городов (на английском/русском языке с маленькой буквы), требуется определить какой максимальной длины можно составить из них цепочку.
Входные данные:
N - количество городов (не больше 20)
name1 - название 1го города (не больше 255 символов)
...
nameN - название последнего города

Последний раз редактировалось overlest, 17.03.2011 в 17:56.
Ответить с цитированием
  #2  
Старый 17.03.2011, 17:56
overlest overlest вне форума
Прохожий
 
Регистрация: 17.03.2011
Сообщения: 2
Репутация: 10
По умолчанию

Очень надо!!!
Ответить с цитированием
  #3  
Старый 17.03.2011, 22:44
mozayka mozayka вне форума
Прохожий
 
Регистрация: 21.03.2010
Адрес: Санкт-Петербург
Сообщения: 12
Версия Delphi: 6 Enterprise
Репутация: 10
По умолчанию

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

Код:
type
  arr_str = array of string;
  arr_int = array of integer;

  mtx_elm = array of arr_int;

function findMaxChainOfCities(tmpSL: TStrings): arr_int;
{-------------------------------------------------------}
{      Функция поиска максимальной по длине цепочки     }
{-------------------------------------------------------}
{                     Параметры:                        }
{ tmpSL - список городов, используемых для формиро- ... }
{        ... вания цепочки из названий городов мак- ... }
{        ... симальной длины                            }
{-------------------------------------------------------}
var
  k: integer;
  tmpCur: arr_int;
  tmpMtx: mtx_elm;

  function createMatrixOfCities(tSL: TStrings): mtx_elm;
  {-------------------------------------------------------}
  { Функция создания матрицы связности для имеющегося ... }
  { ... списка названий городов                           }
  {-------------------------------------------------------}
  var
    i, j: integer;
  begin
    setlength(result, tSL.Count);
    for i:=0 to (tSL.Count - 1) do
      setlength(result[i], tSL.Count);
    for i:=low(result) to high(result) do
      for j:=low(result[i]) to high(result[i]) do
        if (i <> j) then
          begin
            if tSL[i][length(tSL[i])] = tSL[j][1] then
              result[i, j]:=1
            else
              result[i, j]:=0
          end
        else
          result[i, j]:=0
  end;

  procedure findChainOfCities(tCur: arr_int; tMtx: mtx_elm; var tMax: arr_int);
  {-------------------------------------------------------}
  { Функция поиска текущей цепочки из названий городов ...}
  { ... и сравнение её с максимальной                     }
  {-------------------------------------------------------}
  var
    l, j: integer;

    function existCityInChain(tVal: integer; tArr: arr_int): boolean;
    var
      i: integer;
    begin
      result:=false;
      for i:=1 to tArr[0] do
        if tArr[i] = tVal then
          begin
            result:=true; exit
          end
    end;

  begin
    l:=tCur[tCur[0]];
    for j:=low(tMtx) to high(tMtx) do
    if (tMtx[l,j] = 1) and (not existCityInChain(j, tmpCur)) then
      begin
        tCur[0]:=tCur[0] + 1; tCur[tCur[0]]:=j;
        tMtx[l,j]:=-1; // исключить из рассмотрения текущую пару ...
        findChainOfCities(tCur, tMtx, tMax);
        tMtx[l,j]:=1;  // пару снова разрешено использовать ...
        tCur[0]:=tCur[0] - 1
      end;
    if tCur[0] > tMax[0] then
      begin
        for j:=low(tMax) to high(tMax) do
          tMax[j]:=tCur[j]
      end
  end;

begin
  tmpMtx:=createMatrixOfCities(tmpSL);
  setlength(tmpCur, high(tmpMtx) - low(tmpMtx) + 2);
  setlength(result, high(tmpMtx) - low(tmpMtx) + 2);
  for k:=low(tmpMtx) to high(tmpMtx) do
    begin
      tmpCur[0]:=1; tmpCur[1]:=k;
      findChainOfCities(tmpCur, tmpMtx, result)
    end
end;
з.ы.: пример использования кода в прилагаемом архиве ...
Вложения
Тип файла: zip chain of cities.zip (3.8 Кбайт, 6 просмотров)
__________________
... стремясь что-то сделать подумай о том как ты этого будешь достигать ...
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:32.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter