Ескалатори в мола
- Краен срок:
- 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.