Каранаев Линар Минтимерович Стерлибашево 2017 содержание глава реферативное изложение



бет32/64
Дата02.01.2022
өлшемі1.78 Mb.
#452913
түріИзложение
1   ...   28   29   30   31   32   33   34   35   ...   64
обб русский

Указания к выполнению

Ввод и вывод:

Ваша программа читает входные данные из стандартного ввода и пишет их в стандартный вывод. Ваша программа – Игрок 1, а программа жюри – Игрок 2. Когдаваша программа начинает работать, она должна считать следующую информацию из стандартного ввода.

Первая строка содержит одно целое число: количество позиций N. 1

Следующая строка содержит N целых чисел – владельцев позиций. Если позиция i принадлежит игроку 1 (то есть вам), то i-e число равно 1, иначе – 2.

Следующая строка содержитМцелых чисел – цены позиций. Если i-e целое число есть, то цена позиции i равнаj. Все эти величины j удовлетворяют свойствам: 1≤j≤N и все ценыj различны.

Игра начинается с положения фишки в позиции 1. Ваша программа должна играть, как описано ниже, и закончить игру, когда фишка вернется в позицию 1.



  • Если сейчас очередь хода вашей программы, то она должна написать номер следующей позиции Р, 1≤Р≤Мвстандартный вывод.

  • Если сейчас очередь хода вашего противника, то ваша программа должна прочитать номер следующей позиции Р,1≤Р≤N из стандартного ввода.

Рассмотрим следующий пример.

Позиции, помещенные в круглые скобки, принадлежат игроку l,a позиции в квадратных скобках принадлежат игроку 2. Каждая позиция имеетсобственную цену,записанную внутри скобок, и номер позиции рядом. Игра,которую предстоит сыграть, представлена далее.



По завершению игры игрок 1 имеет счет 3, игрок 2 имеет счет 2. Игрок 1 побеждает.



Инструкции по программированию:

В нижеследующем примере target – это целая переменная для позиции.



Средства:

Вам дается программа (score2 для Linux, score2.exe для Windows). Эта программа читает описание игры из файла score.in в вышеописанном формате. Программа пишет эту информацию в стандартный вывод в том же формате. Этот вывод может быть использован для ввода в вашу программу в тестовых целях. После этого программа играет со случайной стратегией, читая ходы вашей программы из стандартного ввода и записывая собственные ходы в стандартный вывод.



Оценивание:

Для каждого теста, если вы выиграли, вы получаете все баллы, иначе – 0баллов.Ввод и вывод вашей программы сохраняются. Затем ваша программа исполняется второй раз, с вводом, перенаправленным из файла, и учетом официальноговремени на тест. Программа должны производить те же самые результаты, чтои при первом запуске.

Тело главной программы выглядит следующим образом:

begin


InputData; {Ввод исходных данных}

Calculate; {Подготовка к работе}

cv:=l; {Текущая вершина}

While true do

begin

ifv[cv]=l {Еслиходмой}



then begin

Next(cv); {Выбратьход}

writeln(cv); {Передать его жюри}

end


else {Ход соперника}

readln(cv); {Ввести ход от соперника}

if cv=1 then exit; {Если вернулись в вершину 1 - конец}

end;


end.

Главная программа очевидна и хорошо самодокументирована. Осталось разобрать содержание вызываемых из главной программы процедур InputData, Calculateи Next(cv). НачнемсInputData.

procedure InputData;

begin


readln(N):

for i:=l to N do

for j:=l to N do read (a[i , j]);

for i:=l to N do read(v[i]);

for i:=l to N do read(c[i]);

end;


Здесь:

  • N – количество позиций;

  • А– граф игры (a[i,j] = 1, если есть дуга из вершины i в вершинуj);

  • V – владельцы позиций v[i] = 1 или = 2;

  • С – цены позиций, от 1 до N, все различны.

Теперьрассмотрим Calculate:

procedure Calculate:

var

i : byte:



begin

for i:=l to N do Sorted[c[i]]:=i;

for i:=l to N do

for j:=l to N do Free[i, j]:=true;

end;

Строка условия задачи «1≤j≤N и все ценыj различны» дает нам замечательнопростой способ отсортировать вершины (позиции) по возрастанию цен:



for i:=l to N do Sorted[c[i]]:=i:

То есть в массиве Sorted на позиции k мы храним номер позиции (вершины), ценакоторой равна k. Кроме того, мы подготавливаем к последующим расчетам массив пометок использованных дуг графа: Free[i,j] =True, если дуга из i ъ] еще неиспользовалась.

И, наконец, процедура Next(cv) по текущей вершине cv вычисляет следующую вершину cv (в случае хода первого игрока):

Procedure Next(var cv:integer);

begin

for i:=N downto 1 do



if(a[cv.Sorted[1]]=l)and(v[Sorted[i]]=l) andFree[cv,Sorted[i]]then

begin


Free[cv.Sorted[i]]:=False;

cv:=Sorted[i];

exit;

end;


for i:=l to N do

if (a[cv.Sorted[i]]=l)and(v[Sorted[i]]=2)and Free[cv,Sorted[i]] then

begin

Free[cv.Sorted[i]]:=False;



cv:=Sorted[i];

exit;


end;

end;


Идея процедуры Next проста. Вначале мы перебираем дуги в принадлежащие нам вершины по убыванию цены (чтобы лучшую взять первой).

Если из текущей вершины нет дуги в нашу вершину, то затем перебираем дугив принадлежащие сопернику вершины в порядке возрастания цены с тем, чтобыхудшую взять первой.[2: 314-318]




Достарыңызбен бөлісу:
1   ...   28   29   30   31   32   33   34   35   ...   64




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет