Pers.narod.ru. Алгоритмы. Строим дерево игры (задача С3 ЕГЭ по информатике)

В этой заметке описана и приведена программа для построения полных деревьев игр, в которых игроки поочерёдно делают ходы, сводящиеся к перемещению фишки на игровом поле, добавлению/удалению камней в одну из двух куч и тому подобным легко формализуемым действиям.

Пример такой задачи показан ниже. С небольшими вариациями она включается в варианты итогового ЕГЭ по информатике 2006-2010 гг. (номер задачи C3).

Два игрока играют в следующую игру. На координатной плоскости стоит фишка. В начале игры фишка находится в точке с координатами (-2,-1). Игроки ходят по очереди. Ход состоит в том, что игрок перемещает фишку из точки с координатами (x,y) в одну из трех точек: (x+3,y), (x,y+4), (x+2,y+2). Игра заканчивается, как только расстояние от фишки до начала координат превысит число 9. Выигрывает игрок, который сделал последний ход. Кто выигрывает при безошибочной игре - игрок, делающий первый ход, или игрок, делающий второй ход? Каким должен быть первый ход выигрывающего игрока? Ответ обоснуйте.

В качестве решения учащийся должен представить неполное дерево игры, то есть, описать игровые ситуации, возникающие после возможных ходов первого и второго игроков. Наша программа не будет заниматься выбором выигрышной стратегии, она просто покажет полное дерево игры в удобном для восприятия и анализа виде. Кроме того, программа может служить примером компактного рекурсивного решения подобных задач (о рекурсии см. главу 18 учебника по Паскалю, а о реализации переборных стратегий на Паскале - эту статью).

Так как дерево может оказаться довольно длинным, вместо вывода на консоль результаты будем выводить в текстовый файл c3.txt. Для вывода на экран просто замените имя файла в операторе assign(f,'c3.txt'); на con.

Все исходные данные игры опишем в виде констант:

const MAXLEVEL=100; {Максимальное число ходов}
      MAXSTEPS=3; {Число вариантов хода}
      x0=-2; {Начальная позиция}
      y0=-1; {игры}
      hod:array [1..MAXSTEPS,1..2] of integer = (         {варианты ходов}
       (3,0), (0,4), (2,2) {в виде смещений координат фишки по осям x и y}
      );

Сама игра будет писаться в двумерный массив, по 1 ходу на строку: var game:array [1..MAXLEVEL,1..2] of integer;

Перебором ходов будет заниматься метод step, которому мы передадим начальную позицию игры и номер хода l (он же будет служить номером строки массива game, в которую пишется этот ход):

step(x0,y0,1);

Метод step сохранит в массиве game очередной ход, вызовом метода endofgame проверит, не достигнут ли конец игры (если да, последовательность ходов игры напечатается методом print), а затем переберёт в цикле все возможные ходы, рекурсивно вызвав себя для каждого из них с изменёнными значениями параметров. Получится вот что:

procedure step (x,y,l:integer);
{x,y - координаты точки, l - уровень просмотра}
var i:integer;
begin
 game[l,1]:=x;
 game[l,2]:=y;
 if endofgame(l) then print(l)
 else for i:=1 to MAXSTEPS do step (x+hod[i,1],y+hod[i,2],l+1);
end;

Метод endofgame использует для проверки завершения игры условие задачи - достижение очередным ходом расстояния от начала координат, большего 9. Подсчёт расстояния сделает функция dist:

function dist(x,y:integer):real;
begin
 dist:=sqrt(sqr(x)+sqr(y));
end;

function endofgame (l:integer):boolean;
begin
 endofgame:=dist(game[l,1],game[l,2])>9;
end;

Метод print распечатает на отдельной строке очередную игру, а в конце выведет победителя (игрока, сделавшего последний ход). Так как ходы делались по очереди, для выявления победителя достаточно проверить чётность или нечётность значения l:

procedure print(l:integer);
var i:integer;
begin
 writeln (f);
 for i:=1 to l do write (f,'(',game[i,1]:2,',',game[i,2]:2,') ');
 if l mod 2 = 0 then write (f,'1 win')
 else write (f,'2 win');
end;

Осталось соединить всё воедино и получить работающую программу:

uses crt;

const MAXLEVEL=100;
      MAXSTEPS=3;
      x0=-2;
      y0=-1;
      hod:array [1..MAXSTEPS,1..2] of integer = (
       (3,0), (0,4), (2,2)
      );

var game:array [1..MAXLEVEL,1..2] of integer;
    f:text; fname:string;

function dist(x,y:integer):real;
begin
 dist:=sqrt(sqr(x)+sqr(y));
end;

function endofgame (l:integer):boolean;
begin
 endofgame:=dist(game[l,1],game[l,2])>9;
end;

procedure print(l:integer);
var i:integer;
begin
 writeln (f);
 for i:=1 to l do write (f,'(',game[i,1]:2,',',game[i,2]:2,') ');
 if l mod 2 = 0 then write (f,'1 win')
 else write (f,'2 win');
end;

procedure step (x,y,l:integer);
{x,y - координаты точки, l - уровень просмотра}
var i:integer;
begin
 game[l,1]:=x;
 game[l,2]:=y;
 if endofgame(l) then print(l)
 else for i:=1 to MAXSTEPS do step (x+hod[i,1],y+hod[i,2],l+1);
end;

begin
 clrscr;
 assign(f,'c3.txt');{con}
 rewrite(f);
 step(x0,y0,1);
 close (f);
end.

Вот листинг файла c3.txt, который она создала:

(-2,-1) ( 1,-1) ( 4,-1) ( 7,-1) (10,-1) 2 win
(-2,-1) ( 1,-1) ( 4,-1) ( 7,-1) ( 7, 3) (10, 3) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 7,-1) ( 7, 3) ( 7, 7) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 7,-1) ( 7, 3) ( 9, 5) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 7,-1) ( 9, 1) 2 win
(-2,-1) ( 1,-1) ( 4,-1) ( 4, 3) ( 7, 3) (10, 3) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 4, 3) ( 7, 3) ( 7, 7) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 4, 3) ( 7, 3) ( 9, 5) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 4, 3) ( 4, 7) ( 7, 7) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 4, 3) ( 4, 7) ( 4,11) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 4, 3) ( 4, 7) ( 6, 9) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 4, 3) ( 6, 5) ( 9, 5) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 4, 3) ( 6, 5) ( 6, 9) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 4, 3) ( 6, 5) ( 8, 7) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 6, 1) ( 9, 1) 2 win
(-2,-1) ( 1,-1) ( 4,-1) ( 6, 1) ( 6, 5) ( 9, 5) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 6, 1) ( 6, 5) ( 6, 9) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 6, 1) ( 6, 5) ( 8, 7) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 6, 1) ( 8, 3) (11, 3) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 6, 1) ( 8, 3) ( 8, 7) 1 win
(-2,-1) ( 1,-1) ( 4,-1) ( 6, 1) ( 8, 3) (10, 5) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 4, 3) ( 7, 3) (10, 3) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 4, 3) ( 7, 3) ( 7, 7) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 4, 3) ( 7, 3) ( 9, 5) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 4, 3) ( 4, 7) ( 7, 7) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 4, 3) ( 4, 7) ( 4,11) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 4, 3) ( 4, 7) ( 6, 9) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 4, 3) ( 6, 5) ( 9, 5) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 4, 3) ( 6, 5) ( 6, 9) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 4, 3) ( 6, 5) ( 8, 7) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 1, 7) ( 4, 7) ( 7, 7) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 1, 7) ( 4, 7) ( 4,11) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 1, 7) ( 4, 7) ( 6, 9) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 1, 7) ( 1,11) 2 win
(-2,-1) ( 1,-1) ( 1, 3) ( 1, 7) ( 3, 9) 2 win
(-2,-1) ( 1,-1) ( 1, 3) ( 3, 5) ( 6, 5) ( 9, 5) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 3, 5) ( 6, 5) ( 6, 9) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 3, 5) ( 6, 5) ( 8, 7) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 3, 5) ( 3, 9) 2 win
(-2,-1) ( 1,-1) ( 1, 3) ( 3, 5) ( 5, 7) ( 8, 7) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 3, 5) ( 5, 7) ( 5,11) 1 win
(-2,-1) ( 1,-1) ( 1, 3) ( 3, 5) ( 5, 7) ( 7, 9) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 6, 1) ( 9, 1) 2 win
(-2,-1) ( 1,-1) ( 3, 1) ( 6, 1) ( 6, 5) ( 9, 5) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 6, 1) ( 6, 5) ( 6, 9) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 6, 1) ( 6, 5) ( 8, 7) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 6, 1) ( 8, 3) (11, 3) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 6, 1) ( 8, 3) ( 8, 7) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 6, 1) ( 8, 3) (10, 5) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 3, 5) ( 6, 5) ( 9, 5) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 3, 5) ( 6, 5) ( 6, 9) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 3, 5) ( 6, 5) ( 8, 7) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 3, 5) ( 3, 9) 2 win
(-2,-1) ( 1,-1) ( 3, 1) ( 3, 5) ( 5, 7) ( 8, 7) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 3, 5) ( 5, 7) ( 5,11) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 3, 5) ( 5, 7) ( 7, 9) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 5, 3) ( 8, 3) (11, 3) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 5, 3) ( 8, 3) ( 8, 7) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 5, 3) ( 8, 3) (10, 5) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 5, 3) ( 5, 7) ( 8, 7) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 5, 3) ( 5, 7) ( 5,11) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 5, 3) ( 5, 7) ( 7, 9) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 5, 3) ( 7, 5) (10, 5) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 5, 3) ( 7, 5) ( 7, 9) 1 win
(-2,-1) ( 1,-1) ( 3, 1) ( 5, 3) ( 7, 5) ( 9, 7) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 4, 3) ( 7, 3) (10, 3) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 4, 3) ( 7, 3) ( 7, 7) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 4, 3) ( 7, 3) ( 9, 5) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 4, 3) ( 4, 7) ( 7, 7) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 4, 3) ( 4, 7) ( 4,11) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 4, 3) ( 4, 7) ( 6, 9) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 4, 3) ( 6, 5) ( 9, 5) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 4, 3) ( 6, 5) ( 6, 9) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 4, 3) ( 6, 5) ( 8, 7) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 1, 7) ( 4, 7) ( 7, 7) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 1, 7) ( 4, 7) ( 4,11) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 1, 7) ( 4, 7) ( 6, 9) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 1, 7) ( 1,11) 2 win
(-2,-1) (-2, 3) ( 1, 3) ( 1, 7) ( 3, 9) 2 win
(-2,-1) (-2, 3) ( 1, 3) ( 3, 5) ( 6, 5) ( 9, 5) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 3, 5) ( 6, 5) ( 6, 9) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 3, 5) ( 6, 5) ( 8, 7) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 3, 5) ( 3, 9) 2 win
(-2,-1) (-2, 3) ( 1, 3) ( 3, 5) ( 5, 7) ( 8, 7) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 3, 5) ( 5, 7) ( 5,11) 1 win
(-2,-1) (-2, 3) ( 1, 3) ( 3, 5) ( 5, 7) ( 7, 9) 1 win
(-2,-1) (-2, 3) (-2, 7) ( 1, 7) ( 4, 7) ( 7, 7) 1 win
(-2,-1) (-2, 3) (-2, 7) ( 1, 7) ( 4, 7) ( 4,11) 1 win
(-2,-1) (-2, 3) (-2, 7) ( 1, 7) ( 4, 7) ( 6, 9) 1 win
(-2,-1) (-2, 3) (-2, 7) ( 1, 7) ( 1,11) 2 win
(-2,-1) (-2, 3) (-2, 7) ( 1, 7) ( 3, 9) 2 win
(-2,-1) (-2, 3) (-2, 7) (-2,11) 1 win
(-2,-1) (-2, 3) (-2, 7) ( 0, 9) ( 3, 9) 2 win
(-2,-1) (-2, 3) (-2, 7) ( 0, 9) ( 0,13) 2 win
(-2,-1) (-2, 3) (-2, 7) ( 0, 9) ( 2,11) 2 win
(-2,-1) (-2, 3) ( 0, 5) ( 3, 5) ( 6, 5) ( 9, 5) 1 win
(-2,-1) (-2, 3) ( 0, 5) ( 3, 5) ( 6, 5) ( 6, 9) 1 win
(-2,-1) (-2, 3) ( 0, 5) ( 3, 5) ( 6, 5) ( 8, 7) 1 win
(-2,-1) (-2, 3) ( 0, 5) ( 3, 5) ( 3, 9) 2 win
(-2,-1) (-2, 3) ( 0, 5) ( 3, 5) ( 5, 7) ( 8, 7) 1 win
(-2,-1) (-2, 3) ( 0, 5) ( 3, 5) ( 5, 7) ( 5,11) 1 win
(-2,-1) (-2, 3) ( 0, 5) ( 3, 5) ( 5, 7) ( 7, 9) 1 win
(-2,-1) (-2, 3) ( 0, 5) ( 0, 9) ( 3, 9) 2 win
(-2,-1) (-2, 3) ( 0, 5) ( 0, 9) ( 0,13) 2 win
(-2,-1) (-2, 3) ( 0, 5) ( 0, 9) ( 2,11) 2 win
(-2,-1) (-2, 3) ( 0, 5) ( 2, 7) ( 5, 7) ( 8, 7) 1 win
(-2,-1) (-2, 3) ( 0, 5) ( 2, 7) ( 5, 7) ( 5,11) 1 win
(-2,-1) (-2, 3) ( 0, 5) ( 2, 7) ( 5, 7) ( 7, 9) 1 win
(-2,-1) (-2, 3) ( 0, 5) ( 2, 7) ( 2,11) 2 win
(-2,-1) (-2, 3) ( 0, 5) ( 2, 7) ( 4, 9) 2 win
(-2,-1) ( 0, 1) ( 3, 1) ( 6, 1) ( 9, 1) 2 win
(-2,-1) ( 0, 1) ( 3, 1) ( 6, 1) ( 6, 5) ( 9, 5) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 6, 1) ( 6, 5) ( 6, 9) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 6, 1) ( 6, 5) ( 8, 7) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 6, 1) ( 8, 3) (11, 3) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 6, 1) ( 8, 3) ( 8, 7) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 6, 1) ( 8, 3) (10, 5) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 3, 5) ( 6, 5) ( 9, 5) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 3, 5) ( 6, 5) ( 6, 9) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 3, 5) ( 6, 5) ( 8, 7) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 3, 5) ( 3, 9) 2 win
(-2,-1) ( 0, 1) ( 3, 1) ( 3, 5) ( 5, 7) ( 8, 7) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 3, 5) ( 5, 7) ( 5,11) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 3, 5) ( 5, 7) ( 7, 9) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 5, 3) ( 8, 3) (11, 3) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 5, 3) ( 8, 3) ( 8, 7) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 5, 3) ( 8, 3) (10, 5) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 5, 3) ( 5, 7) ( 8, 7) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 5, 3) ( 5, 7) ( 5,11) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 5, 3) ( 5, 7) ( 7, 9) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 5, 3) ( 7, 5) (10, 5) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 5, 3) ( 7, 5) ( 7, 9) 1 win
(-2,-1) ( 0, 1) ( 3, 1) ( 5, 3) ( 7, 5) ( 9, 7) 1 win
(-2,-1) ( 0, 1) ( 0, 5) ( 3, 5) ( 6, 5) ( 9, 5) 1 win
(-2,-1) ( 0, 1) ( 0, 5) ( 3, 5) ( 6, 5) ( 6, 9) 1 win
(-2,-1) ( 0, 1) ( 0, 5) ( 3, 5) ( 6, 5) ( 8, 7) 1 win
(-2,-1) ( 0, 1) ( 0, 5) ( 3, 5) ( 3, 9) 2 win
(-2,-1) ( 0, 1) ( 0, 5) ( 3, 5) ( 5, 7) ( 8, 7) 1 win
(-2,-1) ( 0, 1) ( 0, 5) ( 3, 5) ( 5, 7) ( 5,11) 1 win
(-2,-1) ( 0, 1) ( 0, 5) ( 3, 5) ( 5, 7) ( 7, 9) 1 win
(-2,-1) ( 0, 1) ( 0, 5) ( 0, 9) ( 3, 9) 2 win
(-2,-1) ( 0, 1) ( 0, 5) ( 0, 9) ( 0,13) 2 win
(-2,-1) ( 0, 1) ( 0, 5) ( 0, 9) ( 2,11) 2 win
(-2,-1) ( 0, 1) ( 0, 5) ( 2, 7) ( 5, 7) ( 8, 7) 1 win
(-2,-1) ( 0, 1) ( 0, 5) ( 2, 7) ( 5, 7) ( 5,11) 1 win
(-2,-1) ( 0, 1) ( 0, 5) ( 2, 7) ( 5, 7) ( 7, 9) 1 win
(-2,-1) ( 0, 1) ( 0, 5) ( 2, 7) ( 2,11) 2 win
(-2,-1) ( 0, 1) ( 0, 5) ( 2, 7) ( 4, 9) 2 win
(-2,-1) ( 0, 1) ( 2, 3) ( 5, 3) ( 8, 3) (11, 3) 1 win
(-2,-1) ( 0, 1) ( 2, 3) ( 5, 3) ( 8, 3) ( 8, 7) 1 win
(-2,-1) ( 0, 1) ( 2, 3) ( 5, 3) ( 8, 3) (10, 5) 1 win
(-2,-1) ( 0, 1) ( 2, 3) ( 5, 3) ( 5, 7) ( 8, 7) 1 win
(-2,-1) ( 0, 1) ( 2, 3) ( 5, 3) ( 5, 7) ( 5,11) 1 win
(-2,-1) ( 0, 1) ( 2, 3) ( 5, 3) ( 5, 7) ( 7, 9) 1 win
(-2,-1) ( 0, 1) ( 2, 3) ( 5, 3) ( 7, 5) (10, 5) 1 win
(-2,-1) ( 0, 1) ( 2, 3) ( 5, 3) ( 7, 5) ( 7, 9) 1 win
(-2,-1) ( 0, 1) ( 2, 3) ( 5, 3) ( 7, 5) ( 9, 7) 1 win
(-2,-1) ( 0, 1) ( 2, 3) ( 2, 7) ( 5, 7) ( 8, 7) 1 win
(-2,-1) ( 0, 1) ( 2, 3) ( 2, 7) ( 5, 7) ( 5,11) 1 win
(-2,-1) ( 0, 1) ( 2, 3) ( 2, 7) ( 5, 7) ( 7, 9) 1 win
(-2,-1) ( 0, 1) ( 2, 3) ( 2, 7) ( 2,11) 2 win
(-2,-1) ( 0, 1) ( 2, 3) ( 2, 7) ( 4, 9) 2 win
(-2,-1) ( 0, 1) ( 2, 3) ( 4, 5) ( 7, 5) (10, 5) 1 win
(-2,-1) ( 0, 1) ( 2, 3) ( 4, 5) ( 7, 5) ( 7, 9) 1 win
(-2,-1) ( 0, 1) ( 2, 3) ( 4, 5) ( 7, 5) ( 9, 7) 1 win
(-2,-1) ( 0, 1) ( 2, 3) ( 4, 5) ( 4, 9) 2 win
(-2,-1) ( 0, 1) ( 2, 3) ( 4, 5) ( 6, 7) 2 win

Легко заметить, что в этом варианте игры при правильных действиях всегда побеждает первый игрок.

Теперь посмотрим на задачу C3 из рекомендуемых вариантов ЕГЭ 2009 года:

Два игрока играют в следующую игру. На координатной плоскости стоит фишка. Игроки ходят по очереди. В начале игры фишка находится в точке с координатами (5,2). Ход состоит в том, что игрок перемещает фишку из точки с координатами (x,y) в одну из трех точек: или в точку с координатами (x+3,y), или в точку с координатами (x,y+3), или в точку с координатами (x,y+4). Выигрывает игрок, после хода которого расстояние по прямой от фишки до точки с координатами (0,0) не меньше 13 единиц. Кто выигрывает при безошибочной игре обоих игроков - игрок, делающий первый ход, или игрок, делающий второй ход? Каким должен быть первый ход выигрывающего игрока? Ответ обоснуйте.

В нашей программе придётся изменить только положение перед первым ходом x0, y0, массив возможных ходов hod и условие завершения игры в функции endofgame (теперь расстояние от начала координат должно быть не менее 13, а не 9). Изменения выделены красным.

Изменённая таким образом программа легко строит дерево игры этой задачи:

uses crt;

const MAXLEVEL=100;
      MAXSTEPS=3;
      x0=5;
      y0=2;
      hod:array [1..MAXSTEPS,1..2] of integer = (
       (3,0), (0,3), (0,4)
      );

var game:array [1..MAXLEVEL,1..2] of integer;
    f:text; fname:string;

function dist(x,y:integer):real;
begin
 dist:=sqrt(sqr(x)+sqr(y));
end;

function endofgame (l:integer):boolean;
begin
 endofgame:=dist(game[l,1],game[l,2])>13;
end;

procedure print(l:integer);
var i:integer;
begin
 writeln (f);
 for i:=1 to l do write (f,'(',game[i,1]:2,',',game[i,2]:2,') ');
 if l mod 2 = 0 then write (f,'1 win')
 else write (f,'2 win');
end;

procedure step (x,y,l:integer);
{x,y - координаты точки, l - уровень просмотра}
var i:integer;
begin
 game[l,1]:=x;
 game[l,2]:=y;
 if endofgame(l) then print(l)
 else for i:=1 to MAXSTEPS do step (x+hod[i,1],y+hod[i,2],l+1);
end;

begin
 clrscr;
 assign(f,'c3.txt');{con}
 rewrite(f);
 step(x0,y0,1);
 close (f);
end.

Наконец, для построения деревьев игры задач 2006-2008 гг. (про "кучки камней") нам придётся лишь немного поменять логику программы. Дело в том, что там было по 4 возможных хода, 2 из которых приводили к увеличению количества камней во сколько-то раз, а другие два - к увеличению его на заданное число. Поэтому в массиве hod две первых строки будут содержать числа, на которые нужно умножить величины x,y в методе step, а две последних строки - величины, которые нужно прибавить к каждой из куч. Изменится и критерий выхода из игры (см. метод endofgame). Вот задача 2008 года:

Два игрока играют в следующую игру. Перед ними лежат две кучки камней, в первой из которых 1, а во второй - 2 камня. У каждого игрока неограниченно много камней. Игроки ходят по очереди. Ход состоит в том, что игрок или увеличивает в 3 раза число камней в какой-то куче, или добавляет 2 камня в какую-то кучу. Выигрывает игрок, после хода которого общее число камней в двух кучах становится не менее 17 камней. Кто выигрывает при безошибочной игре обоих игроков - игрок, делающий первый ход, или игрок, делающий второй ход? Каким должен быть первый ход выигрывающего игрока? Ответ обоснуйте.

А вот изменённый листинг программы:

uses crt;

const MAXLEVEL=100;
      MAXSTEPS=4;
      x0=1;
      y0=2;
      hod:array [1..MAXSTEPS,1..2] of integer = (
       (3,1), (1,3), (2,0), (0,2)
      );

var game:array [1..MAXLEVEL,1..2] of integer;
    f:text; fname:string;

function endofgame (l:integer):boolean;
begin
 endofgame:=game[l,1]+game[l,2]>16;
end;

procedure print(l:integer);
var i:integer;
begin
 writeln (f);
 for i:=1 to l do write (f,'(',game[i,1]:2,',',game[i,2]:2,') ');
 if l mod 2 = 0 then write (f,'1 win')
 else write (f,'2 win');
end;

procedure step (x,y,l:integer);
{x,y - координаты точки, l - уровень просмотра}
var i:integer;
begin
 game[l,1]:=x;
 game[l,2]:=y;
 if endofgame(l) then print(l)
 else for i:=1 to MAXSTEPS do
  if i<3 then step (x*hod[i,1],y*hod[i,2],l+1)
  else step (x+hod[i,1],y+hod[i,2],l+1);
end;

begin
 clrscr;
 assign(f,'c3.txt');{con}
 rewrite(f);
 step(x0,y0,1);
 close (f);
end.

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz