fork download
  1. <?php
  2.  
  3.  
  4. abstract class Animal
  5. {
  6. protected $x;
  7. protected $y;
  8. protected $field;
  9. protected $excludedAnimals = ["Mouse", "Cat", "Dog"];
  10.  
  11. public function __construct(Field $field)
  12. {
  13. $this->field = $field;
  14. }
  15.  
  16. public function setX($x)
  17. {
  18. $this->x = $x;
  19. }
  20.  
  21. public function setY($y)
  22. {
  23. $this->y = $y;
  24. }
  25.  
  26. public function getX()
  27. {
  28. return $this->x;
  29. }
  30.  
  31. public function getY()
  32. {
  33. return $this->y;
  34. }
  35.  
  36. protected function findAvailableSteps(array $offsets)
  37. {
  38. $adjacentSteps = array_filter($offsets, [$this->field, "positionExists"]);
  39. $availableSteps = $this->field->findOpenSteps($adjacentSteps,
  40. $this->excludedAnimals);
  41. $availableSteps[] = [$this->x, $this->y];
  42. return $availableSteps;
  43. }
  44.  
  45. public function makeStep()
  46. {
  47. $availableSteps = $this->findAvailableSteps($this->findOffsets($this->x,
  48. $this->y));
  49. $estimatedSteps = [];
  50. foreach($availableSteps as $step) {
  51. $estimatedSteps[] = $this->estimateStep($step);
  52. }
  53. $prices = [];
  54. foreach ($estimatedSteps as $step) {
  55. $prices[] = $step["price"];
  56. }
  57. $bestPrice = max($prices);
  58. $bestStep = [];
  59. foreach ($estimatedSteps as $step) {
  60. if ($step["price"] === $bestPrice) {
  61. $bestStep = $step;
  62. break;
  63. }
  64. }
  65. $this->x = $bestStep["x"];
  66. $this->y = $bestStep["y"];
  67. }
  68.  
  69. abstract public function getLabel();
  70. abstract protected function findOffsets($x, $y);
  71. abstract protected function estimateStep($step);
  72. }
  73.  
  74. class Mouse extends Animal
  75. {
  76. private $label = "M";
  77.  
  78. public function getLabel()
  79. {
  80. return $this->label;
  81. }
  82.  
  83. public function isProtected()
  84. {
  85. $currentPos = [$this->x, $this->y];
  86. $adjacentMouses = $this->field->getVisibleAnimals("Mouse",
  87. $currentPos,
  88. 3);
  89. if (count($adjacentMouses) >= 2) {
  90. return true;
  91. }
  92. return false;
  93. }
  94.  
  95. protected function findOffsets($x, $y)
  96. {
  97. $offsets = [
  98. [$x - 1, $y],
  99. [$x, $y + 1],
  100. [$x + 1, $y],
  101. [$x, $y - 1],
  102. ];
  103. return $offsets;
  104. }
  105.  
  106. protected function estimateStep($step)
  107. {
  108. $visibilityDiametr = 9;
  109. $price = 500;
  110. $estimatedStep = [];
  111. $visibleCats = $this->field->getVisibleAnimals("Cat", $step, $visibilityDiametr);
  112. if ($visibleCats) {
  113. $nearestCat = $this->field->getNearestAnimal("Cat", $step);
  114. $horizontalDiff = abs($step[0] - $nearestCat->getX());
  115. $verticalDiff = abs($step[1] - $nearestCat->getY());
  116. $price += ($horizontalDiff + $verticalDiff) * 100;
  117. count($visibleCats) * 3 < 60 ? $price -= count($visibleCats) * 3 : $price;
  118. }
  119. $stepOffsets = $this->findOffsets($step[0], $step[1]);
  120. $nextAvailableSteps = $this->findAvailableSteps($stepOffsets);
  121. $price += count($nextAvailableSteps) * 10;
  122. $estimatedStep["x"] = $step[0];
  123. $estimatedStep["y"] = $step[1];
  124. $estimatedStep["price"] = $price;
  125. return $estimatedStep;
  126. }
  127. }
  128.  
  129. class Cat extends Animal
  130. {
  131. private $label = "K";
  132. private $stepsCounter = 1;
  133. protected $excludedAnimals = ["Cat", "Dog"];
  134.  
  135. public function getLabel()
  136. {
  137. return $this->label;
  138. }
  139.  
  140. protected function findOffsets($x, $y)
  141. {
  142. $offsets = [
  143. [$x - 1, $y],
  144. [$x - 1, $y + 1],
  145. [$x, $y + 1],
  146. [$x + 1, $y + 1],
  147. [$x + 1, $y],
  148. [$x + 1, $y - 1],
  149. [$x, $y - 1],
  150. [$x - 1, $y - 1],
  151. ];
  152. return $offsets;
  153. }
  154.  
  155. protected function findAvailableSteps(array $offsets)
  156. {
  157. $result = [];
  158. $availableSteps = parent::findAvailableSteps($offsets);
  159. foreach ($availableSteps as $step) {
  160. if (!$this->field->positionIntersectsDogs($step)) {
  161. $result[] = $step;
  162. }
  163. }
  164. return $result;
  165. }
  166.  
  167. protected function estimateStep($step)
  168. {
  169. $estimatedStep = [];
  170. $price = 500;
  171. $nearestMouse = $this->field->getNearestAnimal("Mouse", $step);
  172. if ($nearestMouse) {
  173. if ($nearestMouse->isProtected()) {
  174. $price = -1000;
  175. } else {
  176. $horizontalDiff = abs($step[0] - $nearestMouse->getX());
  177. $verticalDiff = abs($step[1] - $nearestMouse->getY());
  178. $price -= ($horizontalDiff + $verticalDiff) * 10;
  179. }
  180. }
  181. $estimatedStep["x"] = $step[0];
  182. $estimatedStep["y"] = $step[1];
  183. $estimatedStep["price"] = $price;
  184. return $estimatedStep;
  185. }
  186.  
  187. public function makeStep()
  188. {
  189. if ($this->label === "@") {
  190. $this->stepsCounter = 0;
  191. $this->label = "K";
  192. } else {
  193. parent::makeStep();
  194. $this->stepsCounter++;
  195. $mouses = $this->field->getAnimalsByType("Mouse");
  196. foreach ($mouses as $m) {
  197. if ($m->getX() === $this->x && $m->getY() === $this->y) {
  198. $this->field->removeAnimal($m);
  199. $this->label = "@";
  200. $this->stepsCounter = 0;
  201. }
  202. }
  203. if ($this->stepsCounter === 8) {
  204. $this->label = "@";
  205. }
  206. }
  207. }
  208. }
  209.  
  210. class Dog extends Animal
  211. {
  212. private $label = "C";
  213.  
  214. public function getLabel()
  215. {
  216. return $this->label;
  217. }
  218.  
  219. protected function findOffsets($x, $y)
  220. {
  221. $offsets = [
  222. [$x - 2, $y],
  223. [$x - 2, $y + 2],
  224. [$x, $y + 2],
  225. [$x + 2, $y + 2],
  226. [$x + 2, $y],
  227. [$x + 2, $y - 2],
  228. [$x, $y - 2],
  229. [$x - 2, $y - 2]
  230. ];
  231. return $offsets;
  232. }
  233.  
  234. protected function estimateStep($step)
  235. {
  236. $estimatedStep = [];
  237. $randomPrice = rand(1, 10000);
  238. $estimatedStep["x"] = $step[0];
  239. $estimatedStep["y"] = $step[1];
  240. $estimatedStep["price"] = $randomPrice;
  241. return $estimatedStep;
  242. }
  243.  
  244. public function getAdjacentSteps()
  245. {
  246. $offsets = [
  247. [$this->x - 1, $this->y],
  248. [$this->x - 1, $this->y + 1],
  249. [$this->x, $this->y + 1],
  250. [$this->x + 1, $this->y + 1],
  251. [$this->x + 1, $this->y],
  252. [$this->x + 1, $this->y - 1],
  253. [$this->x, $this->y - 1],
  254. [$this->x - 1, $this->y - 1],
  255. ];
  256. return array_filter($offsets, [$this->field, "positionExists"]);
  257. }
  258. }
  259.  
  260. class Field
  261. {
  262. private $size;
  263. private $animals;
  264.  
  265. public function __construct($size)
  266. {
  267. $this->size = $size;
  268. }
  269.  
  270. public function getSize()
  271. {
  272. return $this->size;
  273. }
  274.  
  275. public function getAnimals()
  276. {
  277. return $this->animals;
  278. }
  279.  
  280. public function addAnimal(Animal $animal)
  281. {
  282. $this->animals[] = $animal;
  283. }
  284.  
  285. public function removeAnimal(Animal $animal) {
  286. $key = array_search($animal, $this->animals, true);
  287. unset($this->animals[$key]);
  288. }
  289.  
  290. public function getAnimalsByType($type)
  291. {
  292. $func = function($animal) use ($type) {
  293. if (get_class($animal) === $type) {
  294. return $animal;
  295. }
  296. };
  297. return array_filter($this->animals, $func);
  298. }
  299.  
  300. public function drawSchema()
  301. {
  302. $schema = [];
  303. for ($i = 0; $i <= $this->size; $i++) {
  304. $line = array_fill(0, $this->size + 1, ". ");
  305. $schema[] = $line;
  306. }
  307. foreach ($this->animals as $animal) {
  308. $schema[$animal->getX()][$animal->getY()] = $animal->getLabel() . " ";
  309. }
  310. return $schema;
  311. }
  312.  
  313. public function positionExists($pos)
  314. {
  315. $x = $pos[0];
  316. $y = $pos[1];
  317. $haystack = range(0, $this->size);
  318. if (in_array($x, $haystack) && in_array($y, $haystack)) {
  319. return true;
  320. }
  321. return false;
  322. }
  323.  
  324. public function getVisibleAnimals($type, $pos, $diametr)
  325. {
  326. $chosenAnimals = $this->getAnimalsByType($type);
  327. $visibleAnimals = [];
  328. foreach ($chosenAnimals as $animal) {
  329. if (abs($pos[0] - $animal->getX()) <= floor($diametr / 2) &&
  330. abs($pos[1] - $animal->getY()) <= floor($diametr / 2)) {
  331. $visibleAnimals[] = $animal;
  332. }
  333. }
  334. return $visibleAnimals;
  335. }
  336.  
  337. public function getNearestAnimal($type, $pos)
  338. {
  339. $chosenAnimals = $this->getAnimalsByType($type);
  340. $animals = [];
  341. foreach ($chosenAnimals as $animal) {
  342. $posDiff = abs($pos[0] - $animal->getX()) +
  343. abs($pos[1] - $animal->getY());
  344. $animals[$posDiff] = $animal;
  345. }
  346. if ($animals) {
  347. $minPosDiff = min(array_keys($animals));
  348. return $animals[$minPosDiff];
  349. }
  350. return null;
  351. }
  352.  
  353. public function printSchema()
  354. {
  355. $schema = $this->drawSchema();
  356. for ($i = $this->size; $i >= 0; $i--) {
  357. for ($j = 0; $j <= $this->size; $j++) {
  358. echo $schema[$j][$i];
  359. }
  360. echo "\n";
  361. }
  362. }
  363.  
  364. public function positionIsBusy($pos)
  365. {
  366. foreach ($this->animals as $a) {
  367. if ($a->getX() === $pos[0] && $a->getY() === $pos[1]) {
  368. return get_class($a);
  369. }
  370. }
  371. return null;
  372. }
  373.  
  374. public function positionIntersectsDogs($step)
  375. {
  376. $dogs = $this->getAnimalsByType("Dog");
  377. $dogsAdjPositions = [];
  378. foreach ($dogs as $d) {
  379. $dogsAdjPositions = array_merge($dogsAdjPositions,
  380. $d->getAdjacentSteps());
  381. }
  382. foreach ($dogsAdjPositions as $pos) {
  383. if ($pos[0] === $step[0] && $pos[1] === $step[1]) {
  384. return true;
  385. }
  386. }
  387. return false;
  388. }
  389.  
  390. public function findOpenSteps(array $steps, array $animalTypes)
  391. {
  392. $openSteps = [];
  393. foreach ($steps as $step) {
  394. if (!in_array($this->positionIsBusy($step), $animalTypes)) {
  395. $openSteps[] = $step;
  396. }
  397. }
  398. return $openSteps;
  399. }
  400. }
  401.  
  402. class Game
  403. {
  404. private $numMouses;
  405. private $numCats;
  406. private $numDogs;
  407. private $numSteps;
  408. private $field;
  409. private $stepNumber = 0;
  410.  
  411. public function __construct($numMouses, $numCats, $numDogs, $fieldSize, $numSteps)
  412. {
  413. $this->numMouses = $numMouses;
  414. $this->numCats = $numCats;
  415. $this->numDogs = $numDogs;
  416. $this->numSteps = $numSteps;
  417. $this->field = new Field($fieldSize);
  418. }
  419.  
  420. private function createAnimals($limit, $animalType)
  421. {
  422. for ($i = 0; $i < $limit; $i++) {
  423. $animal = new $animalType($this->field);
  424. $this->field->addAnimal($animal);
  425. }
  426. }
  427.  
  428. private function setAnimalsPositions()
  429. {
  430. $unavailableX = [];
  431. $unavailableY = [];
  432. foreach ($this->field->getAnimals() as $animal) {
  433. do {
  434. $x = rand(1, $this->field->getSize());
  435. $y = rand(1, $this->field->getSize());
  436. $animal->setX($x);
  437. $animal->setY($y);
  438. } while (in_array($x, $unavailableX, true &&
  439. in_array($y, $unavailableY, true)));
  440. $unavailableX[] = $animal->getX();
  441. $unavailableY[] = $animal->getY();
  442. }
  443. }
  444.  
  445. private function makeReport()
  446. {
  447. $info = "Ход: " . $this->stepNumber .
  448. "\tМышек: " . count($this->field->getAnimalsByType("Mouse")) .
  449. "\tКошек: " . count($this->field->getAnimalsByType("Cat")) .
  450. "\tСобак: " . count($this->field->getAnimalsByType("Dog"));
  451. return $info;
  452. }
  453.  
  454. private function animalsMakeStep($animalClass)
  455. {
  456. foreach ($this->field->getAnimals() as $animal) {
  457. if (get_class($animal) === $animalClass) {
  458. $animal->makeStep();
  459. }
  460. }
  461. }
  462.  
  463. public function start()
  464. {
  465. $this->createAnimals($this->numMouses, "Mouse");
  466. $this->createAnimals($this->numCats, "Cat");
  467. $this->createAnimals($this->numDogs, "Dog");
  468. $this->setAnimalsPositions();
  469. $this->stepNumber++;
  470. echo $this->makeReport() . "\n";
  471. $this->field->printSchema();
  472. for ($i = 1; $i < $this->numSteps; $i++) {
  473. $this->animalsMakeStep("Mouse");
  474. $this->animalsMakeStep("Cat");
  475. $this->animalsMakeStep("Dog");
  476. $this->stepNumber++;
  477. echo $this->makeReport() . "\n";
  478. $this->field->printSchema();
  479. if (count($this->field->getAnimalsByType("Mouse")) === 0) {
  480. break;
  481. }
  482. }
  483. }
  484. }
  485.  
  486.  
  487. $game = new Game(4, 2, 1, 15, 30);
  488. $game->start();
  489.  
Success #stdin #stdout 0.08s 24400KB
stdin
Standard input is empty
stdout
Ход: 1	Мышек: 4	Кошек: 2	Собак: 1
. . . . . . . . . K . . . . . . 
. . . M . . . . . . . . . . . . 
. . . . . . . . C . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . M . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. K M . M . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
Ход: 2	Мышек: 3	Кошек: 2	Собак: 1
. . . . . . . . K . . . . . . . 
. . . M . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . C . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . M . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . @ . M . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
Ход: 3	Мышек: 3	Кошек: 2	Собак: 1
. . . . . . . . . . . . . . . . 
. . . . M . . K . . . . . . . . 
. . . . . . . . C . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . M . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . M . . . . . . . . . . . 
. . K . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
Ход: 4	Мышек: 3	Кошек: 2	Собак: 1
. . . . . . . . . . . . . . . . 
. . . M . . K . . . . . . . . . 
. . . . . . . . . . C . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . M . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . M . . . . . . . . . . . 
. . . K . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
Ход: 5	Мышек: 3	Кошек: 2	Собак: 1
. . . . . . . . C . . . . . . . 
. . M . . K . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . M . . . . . . . . 
. . . . M . . . . . . . . . . . 
. . . . K . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
Ход: 6	Мышек: 2	Кошек: 2	Собак: 1
. . . . . . C . . . . . . . . . 
. M . . K . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . M . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . @ . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
Ход: 7	Мышек: 2	Кошек: 2	Собак: 1
. . . . C . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. M . K . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . M . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . K . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
Ход: 8	Мышек: 2	Кошек: 2	Собак: 1
. . . . . . . . . . . . . . . . 
. M @ . . . . . . . . . . . . . 
. . . . C . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . M . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . K . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
Ход: 9	Мышек: 2	Кошек: 2	Собак: 1
. . . . . . . . . . . . . . . . 
. . K . . . . . . . . . . . . . 
. M C . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . M . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . K . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
Ход: 10	Мышек: 2	Кошек: 2	Собак: 1
. K . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . C . . . . . . . . . . . 
. M . . . . . M . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . K . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
Ход: 11	Мышек: 2	Кошек: 2	Собак: 1
. . . . . . . . . . . . . . . . 
. K . . . . . . . . . . . . . . 
. . . . . . . M . . . . . . . . 
. . . . . . . . . . . . . . . . 
. M C . . . . K . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
Ход: 12	Мышек: 2	Кошек: 2	Собак: 1
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. K . . . . M . . . . . . . . . 
. . . . . . K . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. M . . . . . . . . . . . . . . 
. . . . C . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
Ход: 13	Мышек: 2	Кошек: 2	Собак: 1
. . . . . . . . . . . . . . . . 
. . . . . . M . . . . . . . . . 
. . . . . . K . . . . . . . . . 
. K . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. M . . . . C . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
Ход: 14	Мышек: 1	Кошек: 2	Собак: 1
. . . . . . . . . . . . . . . . 
. . . . . . . @ . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. K . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. M . . . . . . . . . . . . . . 
. . . . . . C . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
Ход: 15	Мышек: 1	Кошек: 2	Собак: 1
. . . . . . . . . . . . . . . . 
. . . . . . . K . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . K . . . . . . . . . . . . . 
. . . . . . . . C . . . . . . . 
. . M . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
Ход: 16	Мышек: 1	Кошек: 2	Собак: 1
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . K . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . C . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. K . . . . . . . . . . . . . . 
. M . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
Ход: 17	Мышек: 0	Кошек: 2	Собак: 1
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . K . . C . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . @ . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . .