Карнарвон – старинный город в Уэльсе, расположенный на берегу пролива Менай, отделяющего побережье Уэльса от острова Англси. Первые люди поселились здесь еще до нашей эры. До прихода римлян на этих землях жило племя ордовиков. Римляне построили здесь форт, который после их ухода из Британии превратился в руины. Норманны возводят здесь замок, вокруг которого и зарождается город.

В 1955 году Карнарвон выставлял свою кандидатуру на выборах столицы Уэльса, но проиграл Кардиффу. В 1911 году здесь проходила инвеститура (вступление в должность) Эдуарда, принца Уэльского, будущего короля Эдуарда VIII. Это положило начало традиции, и в 1969 году инвеститура принца Чарльза также проходила в Карнарвоне.

Город знаменит прежде всего своим замком. Замок Карнарвон – один из самых больших замков Европы, самое великое сооружение короля Эдуарда I, который сковал весь Уэльс «железным кольцом» замков и крепостей. Это кольцо включает в себя также такие знаменитые замки, как Бомарис, Харлех и Конви. Норманнский замок, возведенный на руинах древнеримского форта, не просуществовал долго – в 1115 году валлийцы вытесняют норманнов со своей территории, и здесь поселяется валлийский правитель принц Лливелин Великий. Королю Эдуарду удалось подчинить Уэльс, и в 1283 году он отдает приказ о строительстве здесь нового замка. По некоторым данным, стоимость строительных работ равнялась всему годовому бюджету тогдашнего Английского королевства – около 22 000 фунтов стерлингов. Замок строился под руководством мастера Джеймса из Сент-Джорджа, опытного архитектора и военного инженера. Бывший норманнский замок составляет восточную, более высокую часть Карнарвона, западная часть чуть ниже. Отличительную особенность замка составляют девять многогранных башен, каждая имеет свое имя: Черная Башня, Северо-восточная башня, Амбарная башня, Колодезная башня, Башня Орла, Башня Королевы, Башня Управляющего, а также Ворота Королевы и ворота Короля. В крепостных стенах на разной высоте сделаны дополнительные галереи для лучников. Внешний вид замка напоминает стены Константинополя, что должно было символизировать незыблемость королевской власти Эдуарда. Замок так и не был достроен полностью – не были закончены ворота, не построены укрепления, разделяющие внутренний двор замка на восточный и западный. Стены и башни сохранились до наших дней в прекрасном состоянии, но от внутренних замковых построек практически ничего не осталось.

С замком Карнарвон связано множество легенд, самая известная – почему старший принц в королевской семье носит титул принца Уэльского. Эдуард I подчинил себе весь Уэльс. Валлийская знать согласилась признать над собой его власть при одном условии: если король даст им правителя, который должен быть знатного рода, быть рожден в Уэльсе и не говорить ни слова по-английски. На что король вынес к собравшимся своего младенца-сына – он королевского рода и он знатен; он родился в Карнарвоне – в Уэльсе и не говорит ни слова по-английски.

Более того, здесь же можно прикоснуться к таинственному миру зазеркалья.

В самом сердце города, на улице Вайнера, 15 открылись лабиринты зеркал и страха.

Заходя сюда с оживленного "Екатеринбуржского Арбата", не чувствуешь никакого подвоха. Приветливая девушка-администратор предлагает испытать себя: сумеешь ли ты войти в лабиринт зеркал с одного входа и выйти через другой? Со стороны кажется, что все просто. Достаточно всего лишь внимательно смотреть по сторонам: с одной все равно будешь отражаться неверно. Но это невозможно: одно неправильное движение - и ты попадаешь в тупик.


Люди у нас часто теряются, -

рассказывает управляющая Екатерина Луч-Демченко.

- Некоторые устают и начинают звать на помощь, тогда мы выводим их. Заметила, что люди, которые в жизни находят выход из самых тупиковых ситуаций, выбираются и из лабиринта.

Один упорный мужчина блуждал целых полтора часа. Знал, что все равно выберется.

Пока мы разговариваем, зашли две женщины с маленькими девочками.

Дети в восторге: они вызвались сами прокладывать путь своим мамам. На удивление, не прошло и 30 минут, как раздались радостные возгласы: "Ура, нашли!" . Это значит, что блуждающим удалось-таки обнаружить единственный проход на другую сторону.

- Наш лабиринт даже длиннее, чем в Москве и Питере , - продолжает Екатерина. - Уборщицы теряются, пытаясь найти обратный выход. Теперь находим их по проводу от пылесосов. Кстати, у них теперь самые модные "селфи" - то и дело фотографируются на фоне зеркал.



Поблуждав какое-то время, спрашиваем то, что нас интересует еще больше. Так ли страшен второй лабиринт, как рассказывают о нем те, кто уже побывал?


- А вы посмотрите сами, - предлагает Екатерина. Вдруг из-за стены (именно там и находится "Лабиринт страха") раздаются душераздирающие вопли и громкие стуки

- Наверное, люди просто слишком эмоциональны , - усмехаюсь я, еще не представляя, что нас ждет.

Итак, на всякий случай отправив фотографа Женю идти первым, ступаю вслед за ним. Все, как в настоящих фильмах ужаса: нарастающая тревожная музыка, чарующая темнота, тусклое мерцание света. Ты самонадеянно думаешь, что пугать тебя будут фигуры скелетов и страшных кукол, но уже после первого поворота понимаешь, как сильно ошибался.


Я визжу от ужаса и вцепляюсь в фотографа. Женя ступает уже мене уверенно, но все равно идет вперед. Пока на его обрушивается новая опасность, меня она настигает как идущую позади. И я вспоминаю, что по законам фильмов ужасов, никакое положение не гарантирует тебе безопасности.

Наше путешествие в мир страха продлилось минут 15, но они показались мне вечностью. Я выхожу и истерично смеюсь, тогда как внутри все сжимаетя от пережитого ужаса.

-Ну как? - улыбаетя Екатерина.

Никакие комнаты страха из "Луна-парков" не идут в сравнение с лабиринтом на Вайнера, 15. Ведь даже взрослые мужчины истошно кричат в его стенах. Поэтому, приводя сюда на свидание свою девушку, имейте ввиду, что неизвестно еще, кому придется защищать другого.

Сейчас в лабиринт приходят в среднем 200 человек за день. Цена билетов одинакова и для детей и взрослых: 200 рублей за лабиринт зеркал и 300 - за вход в лабиринт страха. Если посещаете оба, приготовьте 450 рублей. Детям от 6 до 12 лет вход в лабиринт страха возможен только в присутствии родителей.



Нововведение из российских столиц уже появляется в других крупных городах. В Екатеринбурге же в ближайшее время планируется еще несколько проектов. Так, в июне пойдут два флеш-моба. Один из них - собрание самых жутких персонажей фильмов ужасов.

Секретом остается появление в нашем городе нового заведения от создателей лабиринтов.

- Это будет не менее интересный проект для горожан, - утверждает Екатерина.

Кристина Ермак,
фото Евгения Брюховецкого

Мне нравится

Доброго времени суток, уважаемое сообщество.

Предыстория

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

Вот собственно и он:

Рабочий день был скучный, настроение было отличное. Цель, средства и желание имеются. Вывод очевиден, будем проходить.

История

Для удобного решения, необходимо имеющееся изображение лабиринта, привести к типу двумерного массива. Каждый элемент которого может принять одно из 3-ех значений:

Const WALL=-1; BLANK=-2; DEADBLOCK=-3;

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

Сканирование изображения:

Var N:integer=600; LABIRINT:array of integer; ... var bit:TBitmap; i,j:integer; begin bit:=TBitmap.Create; If OpenDialog1.Execute then begin bit.LoadFromFile(OpenDialog1.FileName); for i:=0 to N do for j:=0 to N do if bit.Canvas.Pixels=clWhite then LABIRINT:=BLANK else LABIRINT:=WALL; bit.Free; ... end; end; ...

Генерация изображения:

Var N:integer=600; LABIRINT:array of integer; ... procedure genBitmap; var bit:TBitmap; i,j:Integer; begin bit:=TBitmap.Create; bit.Width:=N+1; bit.Height:=N+1; for i:=0 to N do for j:=0 to N do begin if LABIRINT=BLANK then bit.Canvas.Pixels:=clWhite // else if LABIRINT=WALL then bit.Canvas.Pixels:=clBlack else bit.Canvas.Pixels:=clRed; end; bit.SaveToFile("tmp.bmp"); bit.Free; end; ...

Для начала, необходимо пересохранить изображение, как монохромный bmp, для того, чтоб иметь 2 цвета белый или черный. Если присмотреться к лабиринту, то он имеет стенку толщиной в 2 пикселя, а дорогу толщиной в 4 пикселя. Идеально было бы сделать, чтоб толщина стенки и дороги была 1 пиксель. Для этого необходимо перестроить изображение, разделить изображение на 3, то есть удалить каждый 2рой и 3тий, ряд и столбик пикселей из рисунка (на правильность и проходимость лабиринта это не повлияет).

Подготовленный рисунок:

Ширина и высота изображения: 1802 пикселя.

1. Используем функцию сканирования изображения.
2. Перестраиваем изображение:

Var N:integer=1801; LABIRINT:array of integer; ... procedure rebuildArr2; var i,j:integer; begin for i:=0 to ((N div 3)) do for j:=0 to ((N div 3)) do LABIRINT:=LABIRINT; N:=N div 3; end; ...

3. Генерируем перестроенное изображение.

Результат работы процедуры:

Ширина и высота изображения: 601 пиксель.

И так, у нас есть изображение лабиринта нужного вида, теперь самое интересное, поиск всех вариантов прохождения лабиринта. Что у нас есть? Массив с записанными значениями WALL - стена и BLANK - дорога.

Была одна неудачная попытка найти прохождение лабиринта с помощью волнового алгоритма. Почему неудачная, во всех попытках данный алгоритм приводил к ошибке «Stack Overflow». Я уверен на 100%, что используя его, можно найти прохождение, но появился запал придумать что-то более интересное.

Идея пришла не сразу, было несколько реализаций прохождения, которые по времени, работали приблизительно по 3 минуты, после чего пришло озарение: «а что, если искать не пути прохождения, а пути которые не ведут к прохождению лабиринта и помечать их как тупиковые».

Алгоритм такой:
Выполнять рекурсивную функцию по всем точкам дорог лабиринта:
1. Если мы стоим на дороге и вокруг нас 3 стены, помечаем место где мы стоим как тупик, в противном случае выходим из функции;
2. Переходим на место которое не является стенкой из пункта №1, и повторяем пункт №1;

Программная реализация:

Var N:integer=600; LABIRINT:array of integer; ... procedure setBlankAsDeadblockRec(x,y:integer); var k:integer; begin k:=0; if LABIRINT=blank then begin if LABIRINT<><><><>BLANK then k:=k+1; if k=4 then LABIRINT:=DEADBLOCK; if k=3 then begin LABIRINT:=DEADBLOCK; if LABIRINT=BLANK then setBlankAsDeadblockRec(x-1,y); if LABIRINT=BLANK then setBlankAsDeadblockRec(x,y-1); if LABIRINT=BLANK then setBlankAsDeadblockRec(x+1,y); if LABIRINT=BLANK then setBlankAsDeadblockRec(x,y+1); end; end; end; procedure setDeadblock; var i,j:integer; begin for i:=1 to N-1 do for j:=1 to N-1 do setBlankAsDeadblockRec(i,j); end; ...

Заключение

Я получил «полный» рабочий алгоритм, который можно использовать для поиска всех прохождений лабиринта. Последний по скорости работы превзошел все ожидания. Надеюсь моя маленькая работа, принесет кому-то пользу или подтолкнет к новым мыслям.

Программный код и пройденный лабиринт:

//Прошу не бить ногами за использованный язык программирования. unit Unit1; interface uses Windows, Graphics, Forms, Dialogs, ExtCtrls, StdCtrls, Controls, Classes; const WALL=-1; BLANK=-2; DEADBLOCK=-3; type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; N:integer=600; LABIRINT:array of integer; implementation {$R *.dfm} procedure genBitmap; var bit:TBitmap; i,j:Integer; begin bit:=TBitmap.Create; bit.Width:=N+1; bit.Height:=N+1; for i:=0 to N do for j:=0 to N do begin if LABIRINT=BLANK then bit.Canvas.Pixels:=clWhite // else if LABIRINT=WALL then bit.Canvas.Pixels:=clBlack else bit.Canvas.Pixels:=clRed; end; bit.SaveToFile("tmp.bmp"); bit.Free; end; procedure rebuildArr2; var i,j:integer; begin for i:=0 to ((N div 3)) do for j:=0 to ((N div 3)) do LABIRINT:=LABIRINT; N:=N div 3; end; procedure setBlankAsDeadblockRec(x,y:integer); var k:integer; begin k:=0; if LABIRINT=blank then begin if LABIRINT<>BLANK then k:=k+1; if LABIRINT<>BLANK then k:=k+1; if LABIRINT<>BLANK then k:=k+1; if LABIRINT<>BLANK then k:=k+1; if k=4 then LABIRINT:=DEADBLOCK; if k=3 then begin LABIRINT:=DEADBLOCK; if LABIRINT=BLANK then setBlankAsDeadblockRec(x-1,y); if LABIRINT=BLANK then setBlankAsDeadblockRec(x,y-1); if LABIRINT=BLANK then setBlankAsDeadblockRec(x+1,y); if LABIRINT=BLANK then setBlankAsDeadblockRec(x,y+1); end; end; end; procedure setDeadblock; var i,j:integer; begin for i:=1 to N-1 do for j:=1 to N-1 do setBlankAsDeadblockRec(i,j); end; procedure TForm1.Button1Click(Sender: TObject); var bit:TBitmap; i,j:integer; begin bit:=TBitmap.Create; If OpenDialog1.Execute then begin bit.LoadFromFile(OpenDialog1.FileName); for i:=0 to N do for j:=0 to N do if bit.Canvas.Pixels=clWhite then LABIRINT:=BLANK else LABIRINT:=WALL; bit.Free; setDeadblock; genBitmap; end; end; end.

Для поиска кратчайшего пути, планируется применить волновой алгоритм к найденным прохождениям лабиринта. Было-бы интересно услышать, какие еще алгоритмы можно применить, для быстрого поиска пути в большом лабиринте?

Существует очень простой способ входить в любой лабиринт, не боясь в нем заблудиться. Пользуясь этим правилом, можно всегда найти обратный выход из всякого лабиринта, как бы запутаны ни были его переходы. Вот в чем состоит правило безопасного блуждания в лабиринтах:

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

Это значит, что при входе в лабиринт вы должны коснуться его стенки одной рукой (все равно, правой или левой) и во все время блуждания в нем продолжать касаться стенки той же самой рукой.

Попробуйте - чтобы испытать этот способ-применить "правило одной руки" для мысленной прогулки по плану Гемптонского лабиринта. Вооружившись спичкой, вообразите, что вы входите в этот садовый лабиринт и все время прикасаетесь одной рукой его стенок. Вы довольно скоро доберетесь от наружного входа до центра лабиринта. Не опускайте здесь вашей руки, продолжайте идти дальше, касаясь ею стенок, и безошибочно выберетесь из его закоулков снова к наружному входу.

Откуда взялось это удобное правило? Постараемся понять это. Представьте, что вы входите с завязанными глазами в комнату, в которую имеется только один вход (рис. 2). Как должны вы поступить, чтобы обойти ее всю и снова выбраться из нее? Проще всего идти вдоль стен, не отрывая руки от стены (рис. 3), тогда вы непременно добредете снова до двери, через которую вы вошли. Здесь разумность "правила одной руки" понятна сама собою. Вообразите теперь, что стены комнаты имеют выступы, как показано на рис. 4 и 5. Перед вами уже не простые комнаты, а настоящие лабиринты. Но "правило одной руки" должно, конечно, и в этих случаях сохранять свою силу, надежно приводя вас снова к выходу из помещения.

"Правило одной руки" имеет и свои неудобства. Пользуясь им, вы можете войти в любой лабиринт и наверняка из него выйти. Но это не значит, что вы обойдете все закоулки лабиринта без исключения. Вы побываете только в тех местах, стенки, которых так или иначе связаны с наружной стеной лабиринта,- составляют как бы ее продолжение. Но вы пройдете мимо тех участков лабиринта, стенки которых не имеют связи с наружными его стенами. В садовом лабиринте Гемптона как раз имеется такой участок, и потому, пользуясь правилом "одной руки", вы не можете пройти по всем дорожкам этого лабиринта: одна дорожка остается не пройденной. На рис. 6 пунктирные линии показывают путь вдоль стен живой изгороди, если пользоваться "правилом одной руки", а звездочка отмечает ту аллею, которая при этом остается не пройденной.

Найдите вещь, которую можно использовать, чтобы помечать каждую тропу. Важно, чтобы выбранное приспособление подходило для того, чтобы делать пометки на полу лабиринта. Например, на твердой поверхности, такой как дерево или бетон, можно использовать мел. В случае других поверхностей подумайте, что вы можете оставить после себя, например, хлебные крошки или камешки.

  • Какой бы предмет вы ни использовали, у вас должна быть возможность сделать два разных вида маркировки. Вам нужно различать пути: какие вы прошли один раз, а какие - два.

Выберите случайную тропу и следуйте по ней до следующего перекрестка. У каждого лабиринта своя планировка на старте. Некоторые могут начинаться с перекрестка, а в других будет только одна тропа. В любом случае выберите любую тропу и идите вперед, пока не достигнете перекрестка или тупика.

Отмечайте тропы по мере их прохождения. Чтобы алгоритм Люка-Тремо сработал, очень важно отслеживать, какие тропы вы уже прошли. Обязательно отмечайте начало и конец каждой тропы любым выбранным для этого способом.

  • Если вы идете по тропе в первый раз, вам нужно сделать на ней одну пометку. Если вы пользуетесь мелом, достаточно начертить одну простую линию. Если вы используете предметы, например, горсть камешков, оставляйте по камешку в начале и в конце тропы.
  • Если вы идете по тропе во второй раз, отметьте ее еще раз. При использовании мела нарисуйте вторую линию, а в случае с предметами просто оставьте второй позади.
  • Если вы зашли в тупик, пометьте тропу, чтобы распознать ее как тупиковую. Например, если вы используете мел, пометьте тропу буквой «Т». Сделайте эту пометку рядом с перекрестком, к которому ведет тропа.
  • На перекрестках отдавайте предпочтение тропам без пометок. Всякий раз выходя на перекресток, выделяйте минутку, чтобы осмотреть пометки на каждой тропе. Некоторые из них могут быть без пометок, в то время как другие покажут, что вы выбирали их уже один раз (или два). Стоит отдавать предпочтение тропам без пометок. Так вы с большей вероятностью будете продвигаться вперед. Если все тропы отмечены по одному разу, выберите одну наугад.

    Избегайте троп, отмеченных дважды. Если вы вынуждены идти по тропе, которую вы уже отметили один раз, вам стоит отметить ее и во второй раз. Согласно алгоритму Люка-Тремо, тропа с двойной пометкой не приведет вас к выходу. Если вы нашли перекресток, где одна тропа отмечена дважды, всегда выбирайте другой путь, даже если это будет означать, что придется возвращаться назад.

    Вернитесь назад, если наткнулись на тупик. Если вы зашли в тупик, вам нужно вернуться к последнему перекрестку, который вы пересекли. Не забудьте пометить тропу, чтобы помнить, что она ведет в тупик. Как только доберетесь до перекрестка, выберите среди оставшихся троп одну и продолжайте пересекать лабиринт.