fork download
  1. <?php
  2.  
  3.  
  4.  
  5. class Field
  6. {
  7. private $animals = [];
  8. private $fieldSchema;
  9. private $fieldSize;
  10.  
  11. public function __construct($fieldSize)
  12. {
  13. $this->fieldSize = $fieldSize;
  14. }
  15.  
  16. public function drawFieldSchema()
  17. {
  18. for($i = 1; $i <= pow($this->fieldSize, 2); $i++) {
  19. $this->fieldSchema[$i] = ". ";
  20. }
  21. }
  22.  
  23. public function addAnimal(Animal $animal)
  24. {
  25. $this->animals[] = $animal;
  26. }
  27.  
  28. public function removeAnimal(Animal $animal)
  29. {
  30. $key = array_search($animal, $this->animals, true);
  31. unset($this->animals[$key]);
  32. }
  33.  
  34. public function drawAnimals()
  35. {
  36. foreach($this->animals as $animal) {
  37. if(get_class($animal) === "Mouse") {
  38. $this->fieldSchema[$animal->getPosition()] = "M ";
  39. } else if(get_class($animal) === "Cat") {
  40. if($animal->isSleepy()) {
  41. $this->fieldSchema[$animal->getPosition()] = "@ ";
  42. } else {
  43. $this->fieldSchema[$animal->getPosition()] = "K ";
  44. }
  45. } else {
  46. $this->fieldSchema[$animal->getPosition()] = "C ";
  47. }
  48. }
  49. }
  50.  
  51. public function concatenateToShema($info, $line)
  52. {
  53. $this->fieldSchema[$line * $this->fieldSize] .= $info;
  54. }
  55.  
  56. public function __toString()
  57. {
  58. $fieldSchemaLined = [];
  59. $chunkedField = array_chunk($this->fieldSchema, $this->fieldSize, true);
  60. foreach($chunkedField as $chunk) {
  61. $fieldSchemaLined = array_merge($fieldSchemaLined, $chunk);
  62. $fieldSchemaLined[] = "\n";
  63. }
  64. return implode("", $fieldSchemaLined);
  65. }
  66. }
  67.  
  68.  
  69. abstract class Animal
  70. {
  71. protected $position;
  72. protected $fieldSize;
  73.  
  74. public function __construct($fieldSize)
  75. {
  76. $this->fieldSize = $fieldSize;
  77. }
  78.  
  79. public function getPosition()
  80. {
  81. return $this->position;
  82. }
  83.  
  84. public function setPosition($position)
  85. {
  86. $this->position = $position;
  87. }
  88.  
  89. protected function findOrthogonalSteps()
  90. {
  91. $orthSteps = [];
  92. if($this->position > $this->fieldSize) {
  93. $orthSteps[] = $this->position - $this->fieldSize;
  94. }
  95. if($this->position % $this->fieldSize !== 0) {
  96. $orthSteps[] = $this->position + 1;
  97. }
  98. if(pow($this->fieldSize, 2) - $this->position >= $this->fieldSize) {
  99. $orthSteps[] = $this->position + $this->fieldSize;
  100. }
  101. if(($this->position - 1) % $this->fieldSize !== 0) {
  102. $orthSteps[] = $this->position - 1;
  103. }
  104. return $orthSteps;
  105. }
  106.  
  107. protected function findDiagonalSteps()
  108. {
  109. $diagonalSteps = [];
  110. if($this->position > $this->fieldSize && $this->position % $this->fieldSize !== 0) {
  111. $diagonalSteps[] = $this->position - $this->fieldSize + 1;
  112. }
  113. if($this->position > $this->fieldSize && ($this->position - 1) % $this->fieldSize !== 0) {
  114. $diagonalSteps[] = $this->position - $this->fieldSize - 1;
  115. }
  116. if(pow($this->fieldSize, 2) - $this->position >= $this->fieldSize &&
  117. $this->position % $this->fieldSize !== 0) {
  118. $diagonalSteps[] = $this->position + $this->fieldSize + 1;
  119. }
  120. if(pow($this->fieldSize, 2) - $this->position >= $this->fieldSize &&
  121. ($this->position - 1) % $this->fieldSize !== 0) {
  122. $diagonalSteps[] = $this->position + $this->fieldSize - 1;
  123. }
  124. return $diagonalSteps;
  125. }
  126.  
  127. protected function excludeClosedPositions(array $animals, array $availableSteps)
  128. {
  129. $animalsPositions = [];
  130. foreach($animals as $animal) {
  131. $animalsPositions[] = $animal->getPosition();
  132. }
  133. $closedPositions = array_intersect($animalsPositions, $availableSteps);
  134. if($closedPositions) {
  135. foreach($closedPositions as $closed) {
  136. $key = array_search($closed, $availableSteps, true);
  137. unset($availableSteps[$key]);
  138. }
  139. }
  140. return $availableSteps;
  141. }
  142.  
  143. protected function calcStepPrice($startPoint, $endPoint)
  144. {
  145. $startPointEdge = $startPoint;
  146. $endPointEdge = $endPoint;
  147. while($startPointEdge % $this->fieldSize !== 0) {
  148. $startPointEdge++;
  149. }
  150. while($endPointEdge % $this->fieldSize !== 0) {
  151. $endPointEdge++;
  152. }
  153. $verticalDiff = abs($startPointEdge - $endPointEdge) / $this->fieldSize;
  154. $horizontalDiff = abs(($startPointEdge - $startPoint) - ($endPointEdge - $endPoint));
  155. return ($verticalDiff + $horizontalDiff) * 10;
  156. }
  157.  
  158. protected function findNearestEnemy(array $enemies)
  159. {
  160. $enemiesPrices = [];
  161. foreach($enemies as $enemy) {
  162. $enemiesPrices[$this->calcStepPrice($this->position, $enemy->getPosition())] = $enemy;
  163. }
  164. return $enemiesPrices[min(array_keys($enemiesPrices))];
  165. }
  166.  
  167. protected function setPricesOfSteps(array $enemies, array $availableSteps)
  168. {
  169. $pricesOfSteps = [];
  170. $endingPosition = $this->findNearestEnemy($enemies)->getPosition();
  171. foreach($availableSteps as $step) {
  172. $price = $this->calcStepPrice($step, $endingPosition);
  173. $pricesOfSteps[$step] = $price;
  174. }
  175. return $pricesOfSteps;
  176. }
  177. }
  178.  
  179.  
  180. class Mouse extends Animal
  181. {
  182. private $isAlive = true;
  183. private $isProtected;
  184.  
  185. private function findVisibleField($sideSize)
  186. {
  187. $upBoundary = $this->position;
  188. $upCounter = 0;
  189. while($upBoundary > $this->fieldSize && $upCounter < ($sideSize - 1) / 2) {
  190. $upBoundary -= $this->fieldSize;
  191. $upCounter++;
  192. }
  193. $leftEdge = $upBoundary;
  194. $counter = 0;
  195. while($leftEdge % $this->fieldSize !== 1 && $counter < ($sideSize - 1) / 2) {
  196. $leftEdge--;
  197. $counter++;
  198. }
  199. $rightEdge = $upBoundary;
  200. $counter = 0;
  201. while($rightEdge % $this->fieldSize !== 0 && $counter < ($sideSize - 1) / 2) {
  202. $rightEdge++;
  203. $counter++;
  204. }
  205. $downBoundary = $this->position;
  206. $downCounter = 0;
  207. while(($downBoundary + $this->fieldSize) < pow($this->fieldSize, 2) &&
  208. $downCounter < ($sideSize - 1) / 2) {
  209. $downBoundary += $this->fieldSize;
  210. $downCounter++;
  211. }
  212. $numRows = $downCounter + $upCounter;
  213. $visibleField = range($leftEdge, $rightEdge);
  214. for($i = 0; $i < count(range($leftEdge, $rightEdge)); $i++) {
  215. $visibleField = array_merge($visibleField, range(($visibleField[$i] + $this->fieldSize) ,
  216. $visibleField[$i] + $this->fieldSize * $numRows,
  217. $this->fieldSize));
  218. }
  219. return $visibleField;
  220. }
  221.  
  222. private function checkProtection(array $sameSpecies)
  223. {
  224. $sameSpeciesPositions = [];
  225. foreach($sameSpecies as $same) {
  226. $sameSpeciesPositions[] = $same->getPosition();
  227. }
  228. $area = array_merge($this->findDiagonalSteps, $this->findOrthogonalSteps);
  229. return (count(array_intersect($area, $sameSpeciesPositions)) >= 2) ? $this->isProtected = true
  230. : $this->isProtected = false;
  231. }
  232.  
  233. public function isProtected()
  234. {
  235. return $this->isProtected;
  236. }
  237.  
  238. private function getDogsProtection(array $dogs)
  239. {
  240. $visibleField = $this->findVisibleField(5);
  241. $dogsPositions = [];
  242. foreach($dogs as $dog) {
  243. $dogsPositions[] = $dog->getPosition();
  244. }
  245. if(array_intersect($visibleField, $dogsPositions)) {
  246. return true;
  247. }
  248. return false;
  249. }
  250.  
  251. public function makeStep(array $enemies, array $neutrals, array $dogs)
  252. {
  253. $availableSteps = $this->findOrthogonalSteps();
  254. $availableSteps = $this->excludeClosedPositions($neutrals, $availableSteps);
  255. $availableSteps[] = $this->position;
  256. $this->checkProtection($neutrals);
  257. $enemyPositions = [];
  258. foreach($enemies as $enemy) {
  259. $enemyPositions[] = $enemy->getPosition();
  260. }
  261. $visibleEnemies = array_intersect($enemyPositions, $this->findVisibleField(9));
  262. if($this->getDogsProtection($dogs)) {
  263. $pricesOfSteps = $this->setPricesOfSteps($dogs, $availableSteps);
  264. $this->position = array_search(min($pricesOfSteps), $pricesOfSteps, true);
  265. } else if($visibleEnemies) {
  266. $pricesOfSteps = $this->setPricesOfSteps($enemies, $availableSteps);
  267. $this->position = array_search(max($pricesOfSteps), $pricesOfSteps, true);
  268. } else {
  269. $this->position = array_rand(array_flip($availableSteps));
  270. }
  271. }
  272.  
  273. public function setState($state)
  274. {
  275. $this->isAlive = $state;
  276. }
  277.  
  278. public function getState()
  279. {
  280. return $this->isAlive;
  281. }
  282. }
  283.  
  284.  
  285. class Cat extends Animal
  286. {
  287. private $stepsToSleepCounter = 1;
  288. private $sleepy = false;
  289.  
  290. public function isSleepy()
  291. {
  292. return $this->sleepy;
  293. }
  294.  
  295. public function makeStep(array $enemies, array $neutrals, array $dogs)
  296. {
  297. if($this->isSleepy()) {
  298. $this->sleepy = false;
  299. $this->stepsToSleepCounter = 0;
  300. } else {
  301. $availableSteps = array_merge($this->findOrthogonalSteps(), $this->findDiagonalSteps());
  302. $availableSteps = $this->excludeClosedPositions($neutrals, $availableSteps);
  303. $availableSteps[] = $this->position;
  304. $pricesOfSteps = $this->setPricesOfSteps($enemies, $availableSteps);
  305. $nearestEnemy = $this->findNearestEnemy($enemies);
  306. $this->position = array_search(min($pricesOfSteps), $pricesOfSteps, true);
  307. $this->stepsToSleepCounter++;
  308. $dogsAdjacentPositions = [];
  309. foreach($dogs as $dog) {
  310. $dogsAdjacentPositions = array_merge($dogsAdjacentPositions, $dog->getAdjacentPositions());
  311. }
  312. $dangerousPositions = array_intersect($dogsAdjacentPositions, $availableSteps);
  313. if($dangerousPositions) {
  314. foreach($dangerousPositions as $closed) {
  315. $key = array_search($closed, $availableSteps, true);
  316. unset($availableSteps[$key]);
  317. }
  318. }
  319. if($this->position === $nearestEnemy->getPosition()) {
  320. $nearestEnemy->setState(false);
  321. $this->sleepy = true;
  322. $this->stepsToSleepCounter = 0;
  323. } else if($this->stepsToSleepCounter === 8) {
  324. $this->sleepy = true;
  325. $this->stepsToSleepCounter = 0;
  326. } else if($nearestEnemy->isProtected()) {
  327. $this->position = array_search(max($pricesOfSteps), $pricesOfSteps, true);
  328. }
  329. }
  330. }
  331. }
  332.  
  333.  
  334. class Dog extends Animal
  335. {
  336. private function findAvailableSteps()
  337. {
  338. $availableSteps = [];
  339. if($this->position > $this->fieldSize * 2) {
  340. $availableSteps[] = $this->position - $this->fieldSize * 2;
  341. }
  342. if($this->position % $this->fieldSize !== 0 &&
  343. ($this->position + 1) % $this->fieldSize !== 0) {
  344. $availableSteps[] = $this->position + 2;
  345. }
  346. if(pow($this->fieldSize, 2) - $this->position >= $this->fieldSize * 2) {
  347. $availableSteps[] = $this->position + $this->fieldSize * 2;
  348. }
  349. if(($this->position - 1) % $this->fieldSize !== 0 &&
  350. ($this->position - 2) % $this->fieldSize !== 0) {
  351. $availableSteps[] = $this->position - 2;
  352. }
  353. if($this->position > $this->fieldSize * 2 &&
  354. $this->position % $this->fieldSize !== 0 &&
  355. ($this->position + 1) % $this->fieldSize !== 0) {
  356. $availableSteps[] = $this->position - $this->fieldSize * 2 + 2;
  357. }
  358. if($this->position > $this->fieldSize * 2 &&
  359. ($this->position - 1) % $this->fieldSize !== 0 &&
  360. ($this->position - 2) % $this->fieldSize !== 0) {
  361. $availableSteps[] = $this->position - $this->fieldSize * 2 - 2;
  362. }
  363. if(pow($this->fieldSize, 2) - $this->position >= $this->fieldSize * 2 &&
  364. $this->position % $this->fieldSize !== 0 &&
  365. ($this->position + 1) % $this->fieldSize !== 0) {
  366. $availableSteps[] = $this->position + $this->fieldSize * 2 + 2;
  367. }
  368. if(pow($this->fieldSize, 2) - $this->position >= $this->fieldSize * 2 &&
  369. ($this->position - 1) % $this->fieldSize !== 0 &&
  370. ($this->position - 2) % $this->fieldSize !== 0) {
  371. $availableSteps[] = $this->position + $this->fieldSize * 2 - 2;
  372. }
  373. return $availableSteps;
  374. }
  375.  
  376. public function makeStep(array $cats, array $mouses, array $dogs)
  377. {
  378. $availableSteps = $this->findAvailableSteps();
  379. $availableSteps = $this->excludeClosedPositions(array_merge($cats, $mouses, $dogs),
  380. $availableSteps);
  381. $availableSteps[] = $this->position;
  382. $this->position = array_rand(array_flip($availableSteps));
  383. }
  384.  
  385. public function getAdjacentPositions()
  386. {
  387. return array_merge($this->findOrthogonalSteps(), $this->findDiagonalSteps());
  388. }
  389. }
  390.  
  391.  
  392. class Game
  393. {
  394. private $numMouses;
  395. private $numCats;
  396. private $numDogs;
  397. private $fieldSize;
  398. private $numSteps;
  399. private $animals = [];
  400. private $field;
  401. private $stepNumber = 1;
  402.  
  403. public function __construct($numMouses, $numCats, $numDogs, $fieldSize, $numSteps)
  404. {
  405. $this->numMouses = $numMouses;
  406. $this->numCats = $numCats;
  407. $this->numDogs = $numDogs;
  408. $this->fieldSize = $fieldSize;
  409. $this->numSteps = $numSteps;
  410. $this->field = new Field($fieldSize);
  411. }
  412.  
  413. private function createAnimals($limit, $animalType)
  414. {
  415. for($i = 0; $i < $limit; $i++) {
  416. $this->animals[] = new $animalType($this->fieldSize);
  417. }
  418. }
  419.  
  420. private function getAnimals($animalType)
  421. {
  422. $animals = [];
  423. foreach($this->animals as $animal) {
  424. if(get_class($animal) === $animalType) {
  425. $animals[] = $animal;
  426. }
  427. }
  428. return $animals;
  429. }
  430.  
  431. private function animalsMakeSteps($animalClass, array $enemies, array $neutrals, array $dogs)
  432. {
  433. foreach($this->animals as $animal) {
  434. if(get_class($animal) === $animalClass) {
  435. $animal->makeStep($enemies, $neutrals, $dogs);
  436. }
  437. }
  438. }
  439.  
  440. private function drawFieldAndAnimals()
  441. {
  442. $this->field->drawFieldSchema();
  443. $this->field->drawAnimals();
  444. }
  445.  
  446. private function removeDeadMouses()
  447. {
  448. foreach($this->animals as $animal) {
  449. if(get_class($animal) === "Mouse") {
  450. if($animal->getState() === false) {
  451. $key = array_search($animal, $this->animals, true);
  452. unset($this->animals[$key]);
  453. $this->field->removeAnimal($animal);
  454. }
  455. }
  456. }
  457. }
  458.  
  459. private function setAnimalPositions()
  460. {
  461. $unavailable = [];
  462. foreach($this->animals as $animal) {
  463. do {
  464. $position = rand(1, pow($this->fieldSize, 2));
  465. $animal->setPosition($position);
  466. } while(in_array($position, $unavailable, true));
  467. $unavailable[] = $animal->getPosition();
  468. $this->field->addAnimal($animal);
  469. }
  470. }
  471.  
  472. private function makeReport()
  473. {
  474. $this->field->concatenateToShema("\tХод: " . $this->stepNumber, 1);
  475. $this->field->concatenateToShema("\tМышек: " . count($this->getAnimals("Mouse")), 2);
  476. $this->field->concatenateToShema("\tКошек: " . count($this->getAnimals("Cat")), 3);
  477. $this->field->concatenateToShema("\tСобак: " . count($this->getAnimals("Dog")), 4);
  478. }
  479.  
  480. public function start()
  481. {
  482. $this->createAnimals($this->numMouses, "Mouse");
  483. $this->createAnimals($this->numCats, "Cat");
  484. $this->createAnimals($this->numDogs, "Dog");
  485. $this->setAnimalPositions();
  486. $this->drawFieldAndAnimals();
  487. $this->makeReport();
  488. echo $this->field;
  489. echo "\n";
  490. for($i = 1; $i < $this->numSteps; $i++) {
  491. $this->animalsMakeSteps("Mouse", $this->getAnimals("Cat"),
  492. $this->getAnimals("Mouse"),
  493. $this->getAnimals("Dog"));
  494. $this->animalsMakeSteps("Cat", $this->getAnimals("Mouse"),
  495. $this->getAnimals("Cat"),
  496. $this->getAnimals("Dog"));
  497. $this->animalsMakeSteps("Dog", $this->getAnimals("Cat"),
  498. $this->getAnimals("Mouse"),
  499. $this->getAnimals("Dog"));
  500. $this->removeDeadMouses();
  501. $this->drawFieldAndAnimals();
  502. $this->stepNumber++;
  503. $this->makeReport();
  504. echo $this->field;
  505. echo "\n";
  506. if(count($this->getAnimals("Mouse")) === 0) {
  507. break;
  508. }
  509. }
  510. }
  511. }
  512.  
  513.  
  514. $game = new Game(4, 2, 1, 15, 25);
  515. $game->start();
  516.  
Success #stdin #stdout 0.06s 24400KB
stdin
Standard input is empty
stdout
. . . . . K . . . . . . . . . 	Ход: 1
. . . . . . . . . . . . . . . 	Мышек: 4
. . . . . . . M . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . K . . . . . . 
M . . . . C . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . M . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . M . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 2
. . . . . . K . . . . . . . . 	Мышек: 4
. . . . . . . . M . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . C K . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
M . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . M . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . M . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 3
. . . . . . . . . . . . . . . 	Мышек: 4
. . . . . . . K . M . . . . . 	Кошек: 2
. . . . . C . . . . . . . . . 	Собак: 1
. . . . . . . . . K . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
M . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . M . . . . . . . . . . 
. . . . . M . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 4
. . . . . . . . K M . . . . . 	Мышек: 4
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . K . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . C . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
M . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . M . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . M . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . @ . . . . . 	Ход: 5
. . . . . . . . . . . . . . . 	Мышек: 3
. . . . . . . . . K . . . . . 	Кошек: 2
. . . C . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
M . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . M . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . M . . . . . . . . . 

. . . . . . . . . K . . . . . 	Ход: 6
. . . . . . . . . . . . . . . 	Мышек: 3
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . K . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. C . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
M . . . M . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . M . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 7
. . . . . . . . K . . . . . . 	Мышек: 3
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . K . . . . . . . 
. . . C . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
M . . . . . . . . . . . . . . 
. . . . M . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . M . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 8
. . . . . . . . . . . . . . . 	Мышек: 3
. . . . . . . K . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . C @ . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
M . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . M . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . M . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 9
. . . . . . . . . . . . . . . 	Мышек: 3
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . K . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . K . . . . . . . . 
. . . . . . . . . . . . . . . 
M . . . . C . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . M . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . M . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 10
. . . . . . . . . . . . . . . 	Мышек: 3
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . K . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . K . . . . . . . . . 
. . . . . C . . . . . . . . . 
M . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . M . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . M . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 11
. . . . . . . . . . . . . . . 	Мышек: 3
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . K . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . K . . . . . . . . . . 
. . . . . . . . . . . . . . . 
M . . C . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . M . . . . . . . . . . 
. . . . . . M . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 12
. . . . . . . . . . . . . . . 	Мышек: 3
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . K . . . . . . . . . . 
. C . . . . . . . . . . . . . 
. . . . K . . . . . . . . . . 
. . . . . . . . . . . . . . . 
M . . . M . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . M . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 13
. . . . . . . . . . . . . . . 	Мышек: 3
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. C . . . K . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . K . . . . . . . . . 
. . . . . M . . . . . . . . . 
M . . . . . . . . . . . . . . 
. . . . . . M . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 14
. . . . . . . . . . . . . . . 	Мышек: 2
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . @ . . . . . . . . 
. C . . . . . . . . . . . . . 
. . . . . . @ . . . . . . . . 
. . . . . . . . . . . . . . . 
M . . . . . . M . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 15
. . . . . . . . . . . . . . . 	Мышек: 2
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . K . . . . . . . . 
. . . C . . . . . . . . . . . 
. . . . . . K . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . M . . . . . . 
M . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 16
. . . . . . . . . . . . . . . 	Мышек: 2
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . K . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . C . K . . . . . . . 
. . . . . . . . . M . . . . . 
. . . . . . . . . . . . . . . 
M . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 17
. . . . . . . . . . . . . . . 	Мышек: 2
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . K . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . K . M . . . . 
. . . C . . . . . . . . . . . 
. M . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 18
. . . . . . . . . . . . . . . 	Мышек: 2
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . K . . . . . 
. C . . . . . . . K M . . . . 
. . . . . . . . . . . . . . . 
. M . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 19
. . . . . . . . . . . . . . . 	Мышек: 1
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. C . . . . . . . . K . . . . 
. . . . . . . . . . @ . . . . 
. . . . . . . . . . . . . . . 
. M . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 20
. . . . . . . . . . . . . . . 	Мышек: 1
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . K K . . . . 
. C . . . . . . . . . . . . . 
. M . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 21
. . . . . . . . . . . . . . . 	Мышек: 1
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. M . C . . . . K K . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 22
. . . . . . . . . . . . . . . 	Мышек: 1
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. C . . . . . . . . . . . . . 
. . . . . . . . K . . . . . . 
. . M . . . . K . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 23
. . . . . . . . . . . . . . . 	Мышек: 1
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . M . . . @ K . . . . . . . 
. . . C . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 24
. . . . . . . . . . . . . . . 	Мышек: 1
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . K . . . . . . . . 
. . . M . . K . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . C . . . . . . . . . . . 
. . . . . . . . . . . . . . . 

. . . . . . . . . . . . . . . 	Ход: 25
. . . . . . . . . . . . . . . 	Мышек: 1
. . . . . . . . . . . . . . . 	Кошек: 2
. . . . . . . . . . . . . . . 	Собак: 1
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . M . K K . . . . . . . . 
. . . . . . . . . . . . . . . 
. C . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . . 
. . . . . . . . . . . . . . .