Игра „Пукане на балони“

Задача #5 от конкурса на Telerik и PC Magazine Bulgaria, сезон 2011/2012

Описание на играта „Пукане на балони“

Играта „Пукане на балони“ се играе от един играч на правоъгълна стена (матрица) от балони. Всеки балон е една част (клетка) от тази стена. Така реално имаме редове и колони от балони и координатите на един балон се описват чрез съответните ред и колона в които се намира. Нека матрицата има R реда и C колони. Ще номерираме редовете и колоните по следния начин:

  • Най-горният ред има номер 0
  • Най-долният ред има номер R-1
  • Най-лявата колона има номер 0
  • Най-дясната колона има номер C-1

Така например балонът в горният ляв ъгъл се намира на ред 0 и колона 0.

Съседи на един балон ще наричаме балоните, които са му директно вляво, вдясно, отгоре и отдолу (тоест един балон има най-много 4 съседа при пълна матрица с балони). Например съседите на балона на позиция (1, 1) са балоните на позиции (0, 1), (1, 2), (2, 1), (1, 0).

Всеки балон е оцветен в някакъв цвят. Този цвят ще описваме с числата от 1 до 4 включително. На всеки ход, играчът пука по един балон. Когато един балон бъде спукан, на негово място остава празно пространство и се предизвиква верижна реакцияпукат се всички негови съседи със същия цвят. Те от своя страна пукат всички техни съседи със същия цвят и така нататък. Когато верижната реакция свърши останалите балони се пренареждат по следния начин: всеки балон, под който има празно пространство, пада надолу (т.е. отива на по-голям по номер ред) докато под него няма друг балон или не стигне до най-долния ред. Тоест, няма случай, в който над празно пространство (празна клетка) остават балони (на картинката е показан пример, в който балонът на позиция (1, 5) бива спукан)

Пукане на балони

За всеки балон, спукан по време на верижна реакция, играчът печели точки, равни на броя балони спукани в тази верижна реакция. Тоест, ако в една верижна реакция са спукани M балона, играчът печели M*M точки (напр. за 4 спукани балона в една верижна реакция, играчът печели 16 точки).

Играта винаги започва с пълна стена (матрица) от балони, т.е. всички клетки са запълнени с балон. Играта свършва, когато всички балони са спукани. Крайните точки на играча представляват сумата от точките, получени при верижните реакции, разделена на броя ходове (броя верижни реакции), които е направил. За верижна реакция също се брои ход, при който е спукан само един балон.

Алгоритмична задача – стратегия за играта „Пукане на балони“

Напишете програма (алгоритъм), която играе играта „Пукане на балони“ и получава накрая възможно най-много точки. Програмата получава информация за стена (матрица) с балони (като всеки балон има цвят, описан с числата от 1 до 4) и трябва да изведе поредица от позиции на балони – всяка една позиция е балонът, пукнат на поредния ход от играта.

Входни данни

Входните данни се четат от конзолата. На първия ред стоят две цели числа R и C – броят редове и броят колони в стената (матрицата). На всеки един от следващите R реда има по C цели числа, разделени с интервали – поредица от цветовете на балоните от съответния ред. Редовете са изредени от 0 до R-1 (отгоре надолу), а колоните – от 0 до C-1 (отляво надясно).

Входните данни за алгоритмичната част винаги ще бъдат валидни и в описания формат.

Изходни данни

Изходът се печата на конзолата (стандартния изход). На първия ред от стандартния изход програмата трябва да отпечата едно цяло число Nброят ходове, които програмата е направила, за да спука всички балони. На всеки от следващите N реда, трябва да се отпечатат точно две цели числа, разделени с точно един интервалредът и колоната (позицията) на балона, който програмата пука на поредния си ход. В посочената клетка на поредния ход трябва задължително да има балон (да не е празна). На края на N-1-вия ред трябва да има знак за нов ред.

Ако изходът е невалиден, или след всички пукания остават неспукани балони, на програмата се присъждат 0 точки.

Ограничения

  • Числата R и C са цели и са в сила ограниченията 3 ? R, C ? 300.
  • Числата, задаващи цветовете на балоните са в интервала [14].
  • Програмата трябва да завършва своята работа за дадена стена с балони за най-много 3 секунди (в противен случай се присъждат 0 точки).

Примери

Резултатът в първия пример е 8*8 + 1*1 + 3*3 = 74, във втория е 6*6 + 3*3 = 54, а в третия е съответно 15*15 = 225.

Вход

Изход

 

Вход

Изход

 

Вход

Изход

3 4

1 2 2 2

3 3 3 3

3 3 3 3

 

3

2 0

2 0

2 1

 

3 3

2 3 2

2 2 2

3 2 3

 

2

1 1

2 1

 

3 5

4 4 4 4 4

4 4 4 4 4

4 4 4 4 4

 

1

0 0

 

 

Задача по приложно програмиране – симулатор на играта „Пукане на балони“

Напишете симулатор, който дава възможност да се играе играта „Пукане на балони“, както от човек, така и от алгоритъм, работещ по гореописаният начин.

Симулаторът задължително трябва да предоставя следните функционалности:

  • Генериране на стена (матрица) по зададени дължина и височина (с размери в гореописаните ограничения)
  • Зареждане на стена от входен файл, форматиран по гореописания начин
  • Възможност за избор на играч (алгоритъм или човек)
  • Изпълнение на ход от играта (когато играе човек да може да избере балон, който да спука), а когато играе алгоритъм, той избира поредния балон за пукане
  • Визуализация на ходовете от играта
  • Показване на крайния резултат след края на играта

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

Критерии за оценяване

Оценяване на алгоритмичната част

При оценяването ще бъдат генерирани 5 различни по големина игрални полета.

  • Всеки алгоритъм ще бъде пуснат да играе на всяко едно от игралните полета.
  • Резултат на един алгоритъм е сумата от резултатите му на различните игрални полета.
  • Накрая, алгоритъмът с най-висок резултат, ще получи 10 точки в крайното класиране, а останалите ще получат пропорционален процент от него, закръглен до цяло число.

Максимални точки в крайното класиране за алгоритмичната част: 10.

Критерии за оценяване на приложната част

Оценяването на приложната задача ще се извърши по-следните критерии:

  • Коректност (доколко задължителните функционалности работят) – 2 точки
  • Справяне с грешки (справяне с некоректно поведение и непредвидени ситуации) – 2 точки
  • Ползваемост (доколко е удобна и интуитивна работата с приложението) – 2 точки
  • UI дизайн (доколко са приятни и удобни интерфейсът и визуализацията) 2 точки
  • Оригинални функции и решения, които да впечатлят журито 2 точки

Максимални точки в крайното класиране за приложната част: 10.

Допълнителни изисквания

Задачите позволяват използването на различни езици за програмиране и технологии (например PHP, C, C++, C#, Delphi, Python, WPF, XAML, Windows Forms, Java, Swing, Flash, JavaScript, HTML5). Всички предадени решения ще бъдат тествани в Windows среда съгласно общите условия на конкурса.

За алгоритмичната част се изисква да бъде предаден пълният сорс код + изпълним файл за Windows (.exe). Ако програмирате на език, който по природа не създава изпълними .exe файлове (например PHP, Python, Java или JavaScript), използвайте подходящ компилатор (потърсете в Интернет).

За приложната част се изисква да бъде предаден пълен сорс код. Състезателите имат право да изберат начина, по който тяхното приложение ще бъде стартирано, така че това да е удобно в Windows среда (приложението може също да бъде web-базирано). Тъй като оценяването на приложната част ще бъде извършвано и от гледната точка на потребител (а потребителите искат да стартират едно приложение възможно най-бързо и лесно), по-сериозни затруднения при намирането и стартирането на приложението ще намалят неговият краен резултат.

Характеристики на системата, върху която ще бъде проведено тестването

  • Intel® Xeon® CPU E31225 @ 3.10 GHz
  • 16 GB RAM
  • 128 MB Video Memory (dedicated) Intel® HD Graphics video card
  • 232 GB HDD
  • Microsoft Windows 7 64-bit OS

Анализ на пети кръг и резултати

Върнахме в детските години за малко (а състезателите за по-дълго) със задачата от пети кръг на състезанието на PC Magazine и Telerik. Участниците трябваше да направят алгоритми, които предизвикват верижни реакции на пукане на балони в правоъгълна матрица (и да го правят бързо), както и приложения, които да визуализират процеса. И в този кръг се оказа, че интересът към визуализирането (изобщо приложните програми) е по-голям, но трябва да се отбележи, че видяхме хитри подходи и в алгоритмичната част. Както обикновено, ето мислите ни над делата на участниците, и както обикновено, резултатите за този кръг може да видите по-надолу (а ние продължаваме с описание на процедурата по оценяването в следващите редове).

За оценяването и резултатите от алгоритмичната част

Само един отбор беше предал тази част. Донякъде учудващо, тъй като задачата не беше твърде сложна за реализиране. Трудно е да се каже, дали тук съществува оптимален алгоритъм, но със сигурност с определени оптимизации тривиалните алгоритми биха завоювали добри резултати. Така или иначе проведохме тестове и оценихме предаденото решение. Истина е, че този алгоритъм не се справяше твърде сполучливо с абсолютно всички тестови случаи, но в много от тях работеше добре и явно следваше стратегия, която му помагаше да прави по-големи верижни реакции. По регламент най-високият резултат в тази част получава 10 точки. И така, в алгоритмичната част имаме еднозначна победа и състезаващият се отбор в тази част бе възнаграден с максималните 10 точки.

За оценяването и резултатите от приложната част

Както обикновено се постарахме да изготвим комплексна оценка на всяко предадено решение за приложната част. В този кръг бяхме поставили някои функционалности, които изисквахме задължително от състезателите, а освен това се надявахме и на имплементация на допълнителни такива. Малко или много, тези очаквания бяха оправдани. Трябва да се отбележи, че не навсякъде задължителните функционалности бяха имплементирани качествено – най-вече от гледна точка на справянето с непредвидени ситуации и некоректен вход (т. нар. error handling). Въпреки това, при правилно поведение на потребителя видяхме доста прилични и интригуващи резултати. Не липсваха и оригинални подходи към решенията, както и към дизайна на приложенията. В тази част също имаме убедителен лидер, който се доближава до максималните  10 точки за кръга.

Крайни резултати

Това е класирането базирано на крайните резултати от пети кръг на състезанието, образувани от сбора на точките от алгоритмичните и приложните части, предадени от състезателите. Поздравления на всички за резултатите! Благодарим Ви за участието!

 

Отбор

Краен резултат

Алгоритъм

Приложение

Станислав Гатев и Георги Ангелов

17

                10

7

Димитър Дилянов Иванов

2

0

                     2

Решенията на участниците от всички кръгове са публично достъпни и след обявяването на резултатите за съответния кръг могат да бъдат намерени на този адрес:

http://pcmagazine-telerik-contest.googlecode.com/svn/trunk/