Ескалатори в мола

Предадени решения

Краен срок:
23.01.2014 17:00
Точки:
10

Срокът за предаване на решения е отминал

Ескалатори в мола

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

Молът е матрица 4×4 като всяка клетка е магазин. Координатите са като на тази картинка:

Координати

В някои от магазините има обитатели, чиято цел е постоянно да обикалят по ескалаторите в мола и да ходят по магазините. В един магазин никога няма повече от един обитател.

Животът на един обитател протича по следния начин:

  • Тръгва от някой магазин.
  • Хваща ескалатор до първия свободен магазин (без друг обитател в него). Редът, в който се пробват магазините е следния:

Координати

Първо горе-вляво, после долу-вдясно, после долу вляво и накрая горе-вдясно. Ако някой от тези опити излиза извън мола, просто отиваме от другата му страна в същата посока:

Координати

  • Движи се по този този начин или докато направи 100 премествания или докато не бъде заклещен и няма къде да ходи. Което и от двете да се случи, обитателят спира и никога повече не се мърда.

Целта е при дадено начално състояние на мола да симулирате как ще се движат обитателите и да ни дадете лог от случилите се събития в правилния ред.

Функцията, която трябва да напишете се казва playMall и приема един аргумент – двумерен масив 4×4, в който празните магазини са обозначени с '-', а хората с 'X':

func playMall(mall [4][4]rune) [][2][2]int

Трябва да върнете вектор от двойки с координати – начална и крайна точка на съответния ход.

Пример:

[[- - - -]
 [- - - -]
 [- - - -]
 [- - - X]]

За този мол резултатът ще е:

[[[3 3] [2 2]] [[2 2] [1 1]] … [[3 3] [-1 -1]]]

Ако някой обитател изчерпа ходовете си, то след стотното преместване в лога трябва да има още един елемент, в който крайната точка е [-1 -1]. Един [-1 -1] елемент на обитател е достатъчен.

Още един пример:

[[X X X X]
 [X X X X]
 [X X X X]
 [X X X X]]

За този модул резултатът ще е подобен на:

[[[0 0] [-2 -2]] [[0 1] [-2 -2]] … [[3 3] [-2 -2]]]

Ако някой обитател няма накъде да мърда, в лога слагаме още един елемент с крайна точка [-2 -2]. Един [-2 -2] елемент на обитател е достатъчен.

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

Някои особености и подсказки:

  • Обитателите трябва да се мърдат паралелно един с друг и независимо един от друг. Не се опитвайте да изпълнявате всичко последователно.
  • Последователността от ходовете в лога трябва да е консистентна. Ако възпроизведем събитията от лога, в никой момент не трябва да има повече от един обитател на едно поле, обитателите не трябва да правят ходове, ако са стигнали лимита си, или ако са заклещени.
  • Примерният тест си е в github.