Напоминание

«Играем в программистов!»


Авторы: Юркевич Александр Никитич, Рейнгольд Григорий Борисович
Должность: педагог дополнительного образования
Учебное заведение: ГАУ ДО Иркутской области и педагог дополнительного образования МБУ ДО г. Иркутска ЦДТТ
Населённый пункт: г. Иркутск
Наименование материала: Учебное пособие
Тема: «Играем в программистов!»
Раздел: дополнительное образование





Назад




1

Министерство образования Иркутской области

Областное государственное образовательное бюджетное

учреждение Иркутской области дополнительного

образования детей

«Центр развития дополнительного образования

детей »

Муниципальное бюджетное учреждение дополнительного

образования г. Иркутска

«Центр детского технического творчества»

Г. Б. Рейнгольд, А. Н. Юркевич, М. Г. Рейнгольд

«Играем в

программистов!»

Материалы х заочной олимпиады по

программированию среди учащихся общего,

профессионального и дополнительного образования

Иркутск

2019

2

Г. Б. Рейнгольд, А. Н. Юркевич, М. Г. Рейнгольд

«Играем в программистов!»

Материалы х заочной олимпиады по программированию среди

учащихся общего, профессионального и дополнительного

образования.

© Г. Б. Рейнгольд, А. Н. Юркевич, М. Г. Рейнгольд, 2019

3

От авторов

Уважаемые коллеги!

Третий

выпуск

методических

разработок

педагогов

Областного

государственного

образовательного

бюджетного

уч ре ж де н и я

И ркут с кой

обла с т и

Ц е н т р

р а з в и т и я

дополнительного

образования

детей

и

Муниципального

бюджетного

образовательного

учреждения

Центр

детского

технического творчества учащихся г. Иркутска, занимающихся

подготовкой программистов, полностью посвящён, областным

заочным олимпиадам по программированию, проходящих под

девизом «Играем в программистов!». Эти олимпиады имеют

немалую историю, они проходят регулярно, начиная с 2000

года. В этом сборнике мы решили поместить материалы Х

областной заочной олимпиады по программированию.

Начиная

с

2001-2002

учебного

года,

все

задачи

объединяются

одной

темой.

Тема

второй

некоторые

проблемы,

которые

приходится

решать

настоящим

программистам,

в

частности

при

изготовлении

текстовых

редакторов. Отсюда и взялся девиз для всех последующих

олимпиад.

Следующие олимпиады были посвящены Григорианскому

календарю,

шахматам,

шифровке

и

дешифровке

текстовой

информации, игре «Тетрис», шашкам, игре в уголки. А темой

последней,

Х

олимпиады,

стала

игра

в

крестики-нолики.

Вообще, различные игры – благодатное поле для олимпиад

такого рода, ведь ничто так не интересно современным детям.

В этот сборник включены задачи и тесты Х областной

заочной олимпиады по программированию, а также авторские

варианты решения этих задач.

Надеемся, что эти материалы окажутся полезными в деле

подготовки юных программистов.

X областная заочная олимпиада

4

по программированию

среди учащихся общего, профессионального и дополнительного

образования

«Играем в программистов»

2009-10 учебного года

«Крестики-нолики»

Уважаемые участники олимпиады!

На этот раз все задачи объединены темой «Крестики-

нолики». Надеемся, что каждый из вас знает эту игру и её

правила. Тем не менее, перед началом работы над задачами

советую ознакомиться с ними.

Правила

Игра ведётся на квадратном поле произвольного размера (не

больше 8х8). Напоминаю, что каждое поле доски имеет своё

название, которое складывается из наименований колонки,

(заглавная латинская буква) и строки (цифра). Строки

нумеруются сверху вниз, колонки – слева направо. Например,

A1левое верхнее поле.

Два игрока поочерёдно делают ходы, то есть ставят на

свободное поле свою фигуру, КРЕСТИК (первый игрок), или

НОЛИК (второй игрок). Начинают всегда КРЕСТИКИ!

Выигрывает тот, кто расположил свои фигуры по одной

ПОЛНОЙ горизонтали, или ВЕРТИКАЛИ, либо одной из

двух ДИАГОНАЛЕЙ. Если ни одному из игроков этого

сделать не удалось, то при полном заполнении игрового

пространства фиксируется НИЧЬЯ.

Уважаемые участники, с особой тщательностью

прочтите нижеследующую информацию!

Система обозначений

5

Фигуры обозначаются следующим образом:

фигуры

1-й

игрок

+

Знак плюс

2-й

игрок

0

Цифра

ноль

1. Положение на доске.

Положение задаётся в

следующем виде.

В первой строке записано

количество строк и колонок

игрового пространства.

Дальше идёт столько строк,

каково вышеуказанное число.

В каждой строке столько же

символов.

Каждый символ либо «+»,

либо «0», либо «-», если поле

свободно.

Примеры положений:

4

0++-

----

0---

----

5

-----

-----

-----

-----

-----

3

-0-

-+-

---

2. Ход.

Ход обозначается следующим образом. Вначале следует

название фигуры. Затем, через пробел, следует название поля.

В случае, если это ход выигрышный, то ставится через пробел

знак «*».

Примеры записи ходов:

+ A1

0 B3 *

Входные данные читаются из файла INPUT.txt, а

выходные данные записываются в файл OUTPUT.txt

текущего каталога.

6

Внимательно читайте условия задач, к каждой из них

приложены примерные тесты. Выбирайте задачи по своим

силам.

Уважаемые участники! Предлагаемые задачи нельзя назвать

лёгкими. Если Вы не можете решить какую-либо задачу

полностью, к чему надо стремиться, то решите её для

посильных частных случаев. Тогда за прохождение

соответствующих тестов Вы получите некоторое количество

баллов.

Желаем творческих успехов!

Задача 1. Разминочная (30 баллов)

Задаётся текущее положение. Сделать программу,

определяющую, сколько фигур заданного вида (+, или 0)

находится на игровом пространстве.

Входные данные: текущее положение и символ +, или 0.

Выходные данные: одно целое число

Примерный тест:

Номер теста

1

Комментарии

Входные данные

4

-+--

+-0-

--0-

----

0

Количество

НУЛИКОВ.

Выходные

данные

2

Аргументы: n – целая, размер поля;

b(n) – символьная, строки поля;

к – символьная, фигура заданного вида.

результат: z - символьная, количество фигур

заданного вида

Промежуточные величины:

i, j – целые, управляющие переменные цикла;

a(n,n) – символьная, клетка поля;

s – целая, счётчик;

Программа на бейсике:

REM X Заочная олимпиада по программированию

REM задача 1

DIM n1 AS INTEGER 'объявление переменных,

размер поля

DIM i AS INTEGER ‘управляющая переменная

цикла

DIM j AS INTEGER ‘управляющая переменная

цикла

DIM s AS INTEGER ‘счётчик

DIM n AS INTEGER ‘размер поля

DIM z AS STRING ‘количество заданных

фигур

DIM k AS STRING ‘заданные фигуры

OPEN "input.txt " FOR INPUT AS #1 'открытие канала для

чтения

OPEN "output.txt " FOR OUTPUT AS #2 'открытие канала

для записи

INPUT #1, n 'чтение из файла размера поля

DIM a(n, n) AS STRING 'объявление массивов,

клетка поля

DIM b(n) AS STRING ‘строки поля

FOR i = 1 TO n 'чтение из файла строк поля

INPUT #1, b(i)

NEXT i

FOR i = 1 TO n 'чтение из строк клеток поля

FOR j = 1 TO n

LET a(i, j) = MID$(b(i), j, 1)

NEXT j

NEXT i

LET s = 0 'обнуление счётчика

INPUT #1, k 'чтение из файла фигуры

FOR i = 1 TO n 'подсчёт количества фигур

FOR j = 1 TO n

IF a(i, j) = k THEN LET s = s + 1

NEXT j

NEXT i

LET z = LTRIM$(STR$(s)) 'убирание из результата

пробелов

PRINT #2, z 'вывод результата

CLOSE 'закрытие каналов

END 'конец

Программа на паскале:

program xolz1;

var

n:string;{Размер поля}

n1:integer; {Размер поля}

kod:integer;

b:array[1..12] of string; {строки поля}

z:string;{количество заданных фигур}

k:char;{заданные фигуры}

i:integer;{управляющая переменная цикла}

j:integer;{управляющая переменная цикла}

a:array[1..12,1..12] of string; {клетка поля}

s:integer; {счётчик}

fil1, fil2: text;{описание файловой переменной для работы с

текстовым файлом}

begin

assign(fil1,'input.txt');{файловой переменной fil1

присваивается имя input.txt}

assign(fil2,'output.txt');{файловой переменной fil2

присваивается имя output.txt}

reset(fil1);{открытие файла для чтения}

readln(fil1,n);{чтение размера поля из файла}

val(n,n1,kod);{присваивание размеру поля целого

значения}

for i:=1 to n1 do {цикл для присваивания значений строк

поля}

readln(fil1,b[i]);

for i:=1 to n1 do {двойной цикл для присваивания

значений клеток поля}

for j:=1 to n1 do

a[i,j]:=copy(b[i],j,1);

s:=0; {обнуление счётчика}

readln(fil1,k); {определение заданной фигуры}

for i:=1 to n1 do {циклы для подсчёта количества

заданных фигур}

for j:=1 to n1 do

if a[i,j]=k then s:=s+1;

str(s,z); {присвоение счётчику символьного

значения}

close(fil1); {закрытие файла для чтения}

rewrite(fil2); {открытие файла для записи}

writeln(fil2,z); {вывод количества фигур в файл}

close(fil2); {закрытие файла для записи}

end. {конец}

Тесты к 1 задаче:

Входные

данные

Выходные

данные

Комментарий

Балл

ы

1

5

-+---

----+

--0--

---+-

--0--

+

3

+

4

2

6

+--+-+

------

--+---

----0-

----0-

----0-

+

4

+

4

3

4

-+--

--0-

---+

----

0

1

0

4

4

3

-0-

-+0

-++

0

2

0

4

5

4

----

----

--+-

----

0

0

0

4

Бонус 10 баллов

Задача 2. Количество ранее сделанных ходов

(50 баллов)

Сделать программу, определяющую количество ранее

сделанных ходов у той стороны, чья очередь ходить.

Входные данные: текущее положение.

Выходные данные: одно число.

Примерный тест:

Входные

данные

4

----

-+0-

--+-

----

Выходные

данные

1

Аргументы: n – целая, размер поля;

в(n) – символьная, строки поля

Результат: z - символьная, количество ранее

сделанных ходов

Промежуточные величины:

i, j – целые, управляющие переменные цикла;

a(n,n) – символьная, клетка поля;

sх, s0 – целые, счётчики.

Программа на бейсике:

REM X Заочная олимпиада по программированию

REM задача 2

DIM n1 AS INTEGER 'объявление переменных

DIM i AS INTEGER

DIM j AS INTEGER

DIM s AS INTEGER

DIM s1 AS INTEGER

DIM n AS STRING

DIM z AS STRING

OPEN "input.txt " FOR INPUT AS #1 'открытие канала для

чтения

OPEN "output.txt " FOR OUTPUT AS #2 'открытие канала

для записи

INPUT #1, n 'чтение из файла размера поля

DIM a(n, n) AS STRING 'объявление массивов

DIM b(n) AS STRING

FOR i = 1 TO n 'чтение из файла строк поля

INPUT #1, b(i)

NEXT i

FOR i = 1 TO n 'чтение из строк клеток поля

FOR j = 1 TO n

LET a(i, j) = MID$(b(i), j, 1)

NEXT j

NEXT i

LET sх = 0 'обнуление счётчиков

LET s0 = 0

FOR i = 1 TO n1 'подсчёт количества крестиков и

ноликов

FOR j = 1 TO n1

IF a(i, j) = "+" THEN LET sх = sх + 1

IF a(i, j) = "0" THEN LET s0 = s0 + 1

NEXT j

NEXT i

IF sх = s0 THEN LET z = LTRIM$(STR$(sх)) ELSE LET z =

LTRIM$(STR$(s0)) 'убирание из результата пробелов

PRINT #2, z 'вывод результата

CLOSE 'закрытие каналов

END 'конец

Программа на паскале:

program xolz2;

var

n:string;{Размер поля}

n1:integer; {Размер поля}

kod:integer;

b:array[1..12] of string; {строки поля}

z:string;{количество заданных фигур}

i:integer;{управляющая переменная цикла}

j:integer;{управляющая переменная цикла}

a:array[1..12,1..12] of string; {клетка поля}

s:integer; {счётчики}

s1:integer;

fil1, fil2: text;{описание файловой переменной для работы с

текстовым файлом}

begin

assign(fil1,'input.txt');{файловой переменной fil1

присваивается имя input.txt}

assign(fil2,'output.txt');{файловой переменной fil2

присваивается имя output.txt}

reset(fil1);{открытие файла для чтения}

readln(fil1,n);{чтение размера поля из файла}

val(n,n1,kod);{присваивание размеру поля целого значения}

for i:=1 to n1 do {цикл для присваивания значений строк

поля}

readln(fil1,b[i]);

for i:=1 to n1 do {двойной цикл для присваивания значений

клеток поля}

for j:=1 to n1 do

a[i,j]:=copy(b[i],j,1);

s:=0; {обнуление счётчиков}

s1:=0;

for i:=1 to n1 do {циклы для подсчёта количества заданных

фигур}

for j:=1 to n1 do

begin

if a[i,j]='+' then s:=s+1;

if a[i,j]='0' then s1:=s1+1;

end;

if s=s1 then str(s,z) else str(s1,z); {присвоение счётчику

символьного значения}

close(fil1); {закрытие файла для чтения}

rewrite(fil2); {открытие файла для записи}

writeln(fil2,z); {вывод количества фигур в файл}

close(fil2); {закрытие файла для записи}

end. {конец}

Тесты ко 2 задаче:

Входные

данные

Выходные

данные

Комментар

ий

Ба

ллы

1

5

-----

-+0--

--++-

-00+-

----0

4

+

9

2

6

------

-+-0--

0+++++

-+0000

+---0-

-0----

8

+

9

3

4

++0+

0++-

000+

+--0

6

0

9

4

3

--+

-+0

0-+

2

0

9

Бонус 14 баллов

Задача 3. Количество возможных ходов (40 баллов)

Сделать программу, определяющую, количество возможных

ходов той стороны, чья очередь ходить.

Входные данные: текущее положение.

Выходные данные: одно число.

Примерные тесты:

Номер теста

1

2

Входные данные

4

+0--

-0++

-+0-

----

3

---

---

---

Выходные данные

9

9

Аргументы: n – символьная, размер поля;

b(n) – символьная, строки поля;

Результат: z - символьная, количество возможных

ходов

Промежуточные величины:

i, j – целые, управляющие переменные цикла;

a(n,n) – символьная, клетка поля;

s – целая, счётчик;

n1 – целая, размер поля.

Программа на бейсике:

REM X Заочная олимпиада по программированию

REM задача 3

DIM n1 AS INTEGER 'объявление переменных

DIM i AS INTEGER

DIM j AS INTEGER

DIM s AS INTEGER

DIM n AS STRING

DIM z AS STRING

OPEN "input.txt " FOR INPUT AS #1 'открытие канала для

чтения

OPEN "output.txt " FOR OUTPUT AS #2 'открытие канала

для записи

INPUT #1, n 'чтение из файла размера поля

LET n1 = VAL(n) 'перевод размера поля в целый

вид

DIM a(n1, n1) AS STRING 'объявление массивов

DIM b(n1) AS STRING

FOR i = 1 TO n1 'чтение из файла строк поля

INPUT #1, b(i)

NEXT i

FOR i = 1 TO n1 'чтение из строк клеток поля

FOR j = 1 TO n1

LET a(i, j) = MID$(b(i), j, 1)

NEXT j

NEXT i

LET s = 0 'обнуление счётчика

FOR i = 1 TO n1 'подсчёт количества ходов

FOR j = 1 TO n1

IF a(i, j) = "-" THEN LET s = s + 1

NEXT j

NEXT i

LET z = LTRIM$(STR$(s)) 'убирание из результата

пробелов

PRINT #2, z 'вывод результата

CLOSE 'закрытие каналов

END 'конец

Программа на паскале:

program xolz3;

var

n:string;{Размер поля}

n1:integer; {Размер поля}

kod:integer;

b:array[1..12] of string; {строки поля}

z:string;{количество заданных фигур}

i:integer;{управляющая переменная цикла}

j:integer;{управляющая переменная цикла}

a:array[1..12,1..12] of string; {клетка поля}

s:integer; {счётчик}

fil1, fil2: text;{описание файловой переменной для работы с

текстовым файлом}

begin

assign(fil1,'input.txt');{файловой переменной fil1

присваивается имя input.txt}

assign(fil2,'output.txt');{файловой переменной fil2

присваивается имя output.txt}

reset(fil1);{открытие файла для чтения}

readln(fil1,n);{чтение размера поля из файла}

val(n,n1,kod);{присваивание размеру поля целого

значения}

for i:=1 to n1 do {цикл для присваивания значений строк

поля}

readln(fil1,b[i]);

for i:=1 to n1 do {двойной цикл для присваивания

значений клеток поля}

for j:=1 to n1 do

a[i,j]:=copy(b[i],j,1);

s:=0; {обнуление счётчика}

for i:=1 to n1 do {циклы для подсчёта количества

заданных фигур}

for j:=1 to n1 do

if a[i,j]='-' then s:=s+1;

str(s,z); {присвоение счётчику символьного

значения}

close(fil1); {закрытие файла для чтения}

rewrite(fil2); {открытие файла для записи}

writeln(fil2,z); {вывод количества фигур в файл}

close(fil2); {закрытие файла для записи}

end. {конец}

Тесты к 3 задаче:

Входные

данные

Выходные

данные

Комментарий

Балл

ы

1

5

-----

-+0--

--++-

-00+-

----0

17

+

10

2

6

------

-+-0--

0+++++

-+0000

+---0-

-0----

20

+

10

3

4

++0+

0++-

000+

+--0

3

0

10

Бонус 10 баллов

Задача 4. Определение сделанного хода (130 баллов)

Задаются два положения. Сделать программу,

определяющую ход, в результате которых первое

расположение может замениться на второе.

Первое и второе расположения отделяются друг от друга

пустой строкой.

В случае невозможности перейти от первого ко второму

расположению одним ходом, вывести No.

Входные данные: два расположения фигур на доске.

Выходные данные: В первой строке число ходов, в

следующих строках – ходы. В случае невозможности No.

Примерные тесты:

Номер

теста

1

2

3

Входные

данные

3

0+-

---

0+-

0+-

-+-

0+-

3

---

-+-

---

---

-+0

---

3

-+0

---

---

-+0

-0-

---

Выходные

данные

+ B2 *

0 C2

No

Аргументы: n – символьная, размер поля;

z – символьная, строки поля;

к – символьная, указатель хода

Ррезультат: с(irez, jrez) - символьная, ход фигуры;

f – символьная, фигура;

к – символьная, указатель хода

Промежуточные величины:

i, j – целые, управляющие переменные цикла;

irez, jrez - целые, координаты поля;

a(n,n) – символьная, первая позиция фигур;

в(n,n) – символьная, вторая позиция фигур;

sх – целая, счётчик +;

s0 – целая, счётчик 0;

n1 – целая, размер поля;

d – целая, разница ходов;

zv – целая, счётчик выигрышной позиции;

xod - символьная, сходившая фигура;

sym – сумма фигур, чья очередь ходить.

Программа на бейсике:

REM X Заочная олимпиада по программированию

REM задача 4

DIM n1 AS INTEGER 'объявление переменных,

размер поля

DIM i AS INTEGER 'управляющая переменная

цикла

DIM j AS INTEGER 'управляющая переменная

цикла

DIM sx AS INTEGER 'счётчик крестиков

DIM irez AS INTEGER 'управляющая переменная

цикла

DIM jrez AS INTEGER 'управляющая переменная

цикла

DIM d AS INTEGER 'разница ходов

DIM r AS INTEGER 'разница ходов

DIM zv AS INTEGER 'счётчик выигрышной

позиции

DIM xod AS STRING 'сходившая фигура

DIM sym AS INTEGER 'сумма фигур, чья очередь

ходить

DIM s0 AS INTEGER 'счётчик ноликов

DIM f AS STRING 'фигура

DIM n AS STRING 'размер поля

DIM z AS STRING 'строка поля

DIM k AS STRING 'указатель поля

OPEN "input.txt " FOR INPUT AS #1 'открытие канала для

чтения

OPEN "output.txt " FOR OUTPUT AS #2 'открытие канала для

записи

INPUT #1, n 'чтение из файла размера поля

LET n1 = VAL(n) 'перевод размера поля в целый

вид

DIM a(n1, n1) AS STRING 'объявление массивов, первая

позиция

DIM b(n1, n1) AS STRING 'вторая позиция

DIM c(n1, n1) AS STRING 'нумерация клеток поля

FOR i = 1 TO n1

INPUT #1, z 'чтение из файла строк поля первой

позиции

FOR j = 1 TO n1

LET a(i, j) = MID$(z, j, 1) 'чтение из строк клеток поля

первой позиции

NEXT j

NEXT i

INPUT #1, k 'чтение из файла указателя хода

FOR i = 1 TO n1

INPUT #1, z 'чтение из файла строк поля второй

позиции

FOR j = 1 TO n1

LET b(i, j) = MID$(z, j, 1) 'чтение из строк клеток поля

второй позиции

NEXT j

PRINT

NEXT i

LET sx = 0 'обнуление счётчиков

LET s0 = 0

LET d = 0

LET sym = 0

LET zv = 0

FOR i = 1 TO n1 'подсчёт количества сделанных

ходов

FOR j = 1 TO n1

IF (b(i, j) <> a(i, j)) AND (a(i, j) = "-") THEN LET d = d + 1

IF b(i, j) = "+" THEN LET sx = sx + 1

IF b(i, j) = "0" THEN LET s0 = s0 + 1

IF (b(i, j) <> a(i, j)) AND (a(i, j) <> "-") THEN LET d = d + 2

NEXT j

NEXT i

IF s0 > sx THEN LET d = d + 2 'определение очерёдности

хода

IF sx > s0 THEN

LET r = sx - s0

LET xod = "+"

IF r > 1 THEN d = d + 2

END IF

IF s0 = sx THEN LET xod = "0"

IF d = 1 THEN

FOR i = 1 TO n1 'проверка выигрышного хода по

горизонтали

sym = 0

FOR j = 1 TO n1

IF b(i, j) = xod THEN LET sym = sym + 1

NEXT j

IF sym = n1 THEN LET zv = 1

NEXT i

FOR j = 1 TO n1 'проверка выигрышного хода по

вертикали

sym = 0

FOR i = 1 TO n1

IF b(i, j) = xod THEN LET sym = sym + 1

NEXT i

IF sym = n1 THEN LET zv = 1

NEXT j

sym = 0 'проверка выигрышного хода по

главной диагонали

FOR i = 1 TO n1

LET j = i

IF b(i, j) = xod THEN LET sym = sym + 1

IF sym = n1 THEN LET zv = 1

NEXT i

sym = 0 'проверка выигрышного хода по

побочной диагонали

j = n1 + 1

FOR i = 1 TO n1

LET j = j - 1

IF b(i, j) = xod THEN LET sym = sym + 1

IF sym = n1 THEN LET zv = 1

NEXT i

FOR i = 1 TO n1 'присвоение координат

выигрышного поля

FOR j = 1 TO n1

IF b(i, j) <> a(i, j) THEN

LET irez = j

LET jrez = i

END IF

NEXT j

NEXT i

END IF

FOR i = 1 TO n1

FOR j = 1 TO n1

SELECT CASE i

CASE 1

LET c(i, j) = "A" + LTRIM$(STR$(j))

CASE 2

LET c(i, j) = "B" + LTRIM$(STR$(j))

CASE 3

LET c(i, j) = "C" + LTRIM$(STR$(j))

CASE 4

LET c(i, j) = "D" + LTRIM$(STR$(j))

CASE 5

LET c(i, j) = "E" + LTRIM$(STR$(j))

CASE 6

LET c(i, j) = "F" + LTRIM$(STR$(j))

CASE 7

LET c(i, j) = "G" + LTRIM$(STR$(j))

CASE 8

LET c(i, j) = "H" + LTRIM$(STR$(j))

END SELECT

NEXT j

NEXT i

IF zv = 1 THEN LET k = "*" 'указывает на то, что ход

выигрышный

IF d = 1 THEN 'присвоение итоговых значений и

вывод результата

IF sx > s0 THEN LET f = "+" ELSE LET f = "0"

PRINT #2, f; " "; c(irez, jrez); " "; k

ELSE

PRINT #2, "NO"

END IF

CLOSE 'закрытие каналов

END 'конец

Программа на паскале:

program xolz4;

var

n:string;{Размер поля в символьном виде }

pole:string;

n1:integer; {Размер поля в целом виде}

kod:integer;

a:array[1..9, 1..9] of string; {клетки поля первой позиции}

b:array[1..9, 1..9] of string; {клетки поля второй позиции}

c:array[1..9, 1..9] of string; {клетки поля итоговой позиции}

z:string;{строка поля}

i:integer;{управляющая переменная цикла}

j:integer;{управляющая переменная цикла}

jsim:string;

irez:integer;{координата поля}

jrez:integer;{координата поля}

k:string;{указатель хода}

f:string;{фигура}

d:integer;{разница ходов}

xod:string;{сходившая фигура}

sym:integer;{сумма фигур, чья очередь ходить}

zv:integer;{счётчик выигрышной позиции}

r:integer;{разница ходов}

s0:integer; {счётчик ноликов}

sx:integer; {счётчик крестиков}

fil1, fil2: text;{описание файловой переменной для работы с

текстовым файлом}

begin

assign(fil1,'input.txt');{файловой переменной fil1

присваивается имя input.txt}

assign(fil2,'output.txt');{файловой переменной fil2

присваивается имя output.txt}

reset(fil1);{открытие файла для чтения}

readln(fil1,n);{чтение размера поля из файла}

val(n,n1,kod);{присваивание размеру поля целого значения}

for i:=1 to n1 do {цикл чтения первой позиции}

begin

readln(fil1,z);{чтение строки из файла}

for j:=1 to n1 do

a[i,j]:=copy(z,j,1);{чтение клеток поля из строки}

end;

readln(fil1,k);{чтение указателя хода из файла}

for i:=1 to n1 do {цикл чтения второй позиции}

begin

readln(fil1,z);{чтение строки из файла}

for j:=1 to n1 do

b[i,j]:=copy(z,j,1);{чтение клеток поля из строки}

end;

s0:=0; {обнуление счётчиков}

sx:=0;

d:=0;

sym:=0;

zv:=0;

for i:=1 to n1 do {проверка очерёдности хода}

for j:=1 to n1 do

begin

if (b[i,j]<>a[i,j]) and (a[i,j]='-') then d:=d+1;

if b[i,j]='+' then sx:=sx+1;

if b[i,j]='0' then s0:=s0+1;

if (b[i,j]<>a[i,j]) and (a[i,j]<>'-') then d:=d+2;

end;

if s0>sx then d:=d+2;

if sx>s0 then

begin

r:=sx-s0;

xod:='+';

if r>1 then d:=d+2;

end;

if s0=sx then xod:='0';

if d=1 then

begin {проверка выигрышной позиции}

for i:=1 to n1 do {проверка выигрышной позиции по

горизонтали}

begin

sym:=0;

for j:=1 to n1 do

if b[i,j]=xod then sym:=sym+1;

if sym=n1 then zv:=1;

end;

for j:=1 to n1 do {проверка выигрышной позиции по

вертикали}

begin

sym:=0;

for i:=1 to n1 do

if b[i,j]=xod then sym:=sym+1;

if sym=n1 then zv:=1;

end;

sym:=0; {проверка выигрышной позиции по главной

диагонали}

for i:=1 to n1 do

begin

j:=i;

if b[i,j]=xod then sym:=sym+1;

if sym=n1 then zv:=1;

end;

sym:=0; {проверка выигрышной позиции по

обратной диагонали}

j:=n1+1;

for i:=1 to n1 do

begin

j:=j-1;

if b[i,j]=xod then sym:=sym+1;

if sym=n1 then zv:=1;

end;

for i:=1 to n1 do {присваивание координат поля хода}

for j:=1 to n1 do

if b[i,j]<>a[i,j] then

begin

irez:=j;

jrez:=i;

end;

end;

for i:=1 to n1 do {присваивание координат всему игровому

полю}

for j:=1 to n1 do

case i of

1: begin

str(j,jsim);

c[i,j]:='A'+jsim;

end;

2: begin

str(j,jsim);

c[i,j]:='B'+jsim;

end;

3: begin

str(j,jsim);

c[i,j]:='C'+jsim;

end;

4: begin

str(j,jsim);

c[i,j]:='D'+jsim;

end;

5: begin

str(j,jsim);

c[i,j]:='E'+jsim;

end;

6: begin

str(j,jsim);

c[i,j]:='F'+jsim;

end;

7: begin

str(j,jsim);

c[i,j]:='G'+jsim;

end;

8: begin

str(j,jsim);

c[i,j]:='H'+jsim;

end;

end;

close(fil1); {закрытие файла для чтения}

rewrite(fil2); {открытие файла для записи}

if zv=1 then k:='*';

if d<>1 then

writeln(fil2,'NO'); {вывод в файл сообщения}

if d=1 then

begin

if sx>s0 then f:='+' else f:='0';

pole:=f+' '+c[irez,jrez]+' '+k;

writeln(fil2,pole); {вывод хода в файл}

end;

close(fil2); {закрытие файла для записи}

end. {конец}

Тесты к 4 задаче:

Входные

данные

Выходные

данные

Комментарий

Балл

ы

1

5

-----

-+0--

--++-

-00+-

----0

----+

-+0--

--++-

-00+-

----0

+ E1

+

5

2

6

------

-+-0--

0+++++

-+0000

+---0-

-0----

+-----

-+-0--

0+++++

-+0000

+---0-

-0----

+ A1

+

5

3

4

++0+

0++-

000+

+--0

++0+

0++-

000+

+-00

0 C4

0

5

4

3

--+

-+0

0-+

--+

-+0

00+

0 B3

0

5

5

5

-----

-----

-----

-----

-----

-----

-----

--+--

-----

-----

+ C3

+ из НП

5

6

3

0++

-+0

-0-

+ A3 *

+* Вт д

5

0++

-+0

+0-

7

3

-++

-+0

00-

+++

-+0

00-

+ A1 *

+* Гор

8

5

--+-0

--+--

--+00

--++0

----0

--+-0

--+--

--+00

--++0

--+-0

+ C5 *

+* Верт

5

9

3

-++

-0-

-+0

0++

-0-

-+0

0 A1 *

0* Гл д

5

10

4

----

000-

-+++

---+

0 D2 *

0* Гор

5

----

0000

-+++

---+

11

5

-----

-----

--+0-

--+0-

-----

-----

-----

--+00

--+0-

-----

No

Ход вне

очереди

5

12

4

----

-+0-

-+--

----

----

-+0-

-+--

-+--

No

Ход вне

очереди

5

13

4

----

-+0-

-+--

----

----

-+0-

-+--

----

No

Нет хода

5

14

5

-----

-----

--+0-

--+0-

-----

-----

-----

--+0-

--+0-

-----

No

Нет хода

5

15

3

---

-+0

---

--0

-+-

--+

No

Просто

5

16

5

-----

---0-

--+--

+----

-----

-----

---0-

--+--

-+---

----0

No

Просто

5

17

5

No

Наоборот

5

-----

-----

--+--

---0+

-----

-----

-----

--+--

---0-

-----

18

5

--+-0

--+--

--+00

--++0

--+-0

--+-0

--+--

--+00

--++0

----0

No

Наоборот

5

Бонус 40 баллов

Задача 5. Выигрыш в один ход (250 баллов)

Сделать программу, определяющую может ли сторона, чья

очередь ходить, выиграть в один ход. Если да, то выдать

количество таких ходов и все эти ходы, иначе выдать No.

Если таких ходов больше одного, они выдаются в порядке

возрастания наименований колонок, номеров строк.

Входные данные: текущее положение.

Выходные данные: одно число и столько ходов, каково это

число. Всё в отдельной строке.

Примерные тесты:

Номер

теста

1

2

3

Входные

данные

3

---

-+-

---

4

+++-

+00-

+00-

---0

5

--+0-

--+--

-0+--

0-+--

---0-

Выходны

е данные

No

2

+ A4 *

+ D1 *

1

С5 *

Аргументы: n – символьная, размер поля;

z – символьная, строки поля;

к – символьная, указатель хода

Результат: с(irez, jrez) - символьная, ход фигуры;

f – символьная, фигура;

к – символьная, указатель хода

Промежуточные величины:

i, j – целые, управляющие переменные цикла;

n1 – целая, размер поля;

a(n1,n1) – символьная, позиция фигур;

sх – целая, счётчик +;

s0 – целая, счётчик 0;

d – целая, разница ходов;

zv – целая, счётчик выигрышной позиции;

xod - символьная, сходившая фигура;

sym – сумма фигур, чья очередь ходи

Программа на бейсике:

CLS

REM X Заочная олимпиада по программированию

REM задача 5

DIM n AS INTEGER 'объявление переменных,

размер поля

DIM i AS INTEGER 'управляющая переменная

цикла

DIM j AS INTEGER 'управляющая переменная

цикла

DIM sx AS INTEGER 'счётчик крестиков

DIM so AS INTEGER 'счётчик ноликов

DIM d AS INTEGER 'разница ходов

DIM r AS INTEGER 'разница ходов

DIM zv AS INTEGER 'счётчик выигрышной

позиции

DIM xod AS STRING 'фигура, чья очередь ходить

DIM sym AS INTEGER 'сумма фигур, чья очередь

ходить

DIM f AS STRING 'фигура

DIM z AS STRING 'строка поля

DIM k AS STRING 'указатель поля

OPEN "input.txt " FOR INPUT AS #1 'открытие канала для

чтения

OPEN "output.txt " FOR OUTPUT AS #2 'открытие канала

для записи

INPUT #1, z 'чтение из файла размера поля

LET n = VAL(z) 'перевод размера поля в целый

вид

DIM a(n, n) AS STRING 'объявление массивов,

позиция фигур

DIM c(n, n) AS STRING 'ход фигуры

FOR i = 1 TO n

INPUT #1, z 'чтение из файла строк поля

позиции фигур

FOR j = 1 TO n

LET a(i, j) = MID$(z, j, 1) 'чтение из строк клеток поля

позиции фигур

NEXT j

NEXT i

LET sx = 0 'обнуление счётчиков

LET so = 0

LET d = 0

LET r = 0

LET sym = 0

LET zv = 0

LET k = ""

FOR i = 1 TO n 'подсчёт количества сделанных

ходов

FOR j = 1 TO n

IF a(i, j) = "+" THEN LET sx = sx + 1

IF a(i, j) = "0" THEN LET so = so + 1

LET c(i, j) = ""

NEXT j

NEXT i

IF sx > so THEN LET xod = "0" 'определение очерёдности

хода

IF sx = so THEN LET xod = "+"

FOR i = 1 TO n 'определение выигрыша по

горизонтали

LET sym = 1

LET zv = 0

FOR j = 1 TO n

IF a(i, j) = xod THEN LET sym = sym + 1

NEXT j

IF sym = n THEN LET zv = 1

IF zv = 1 THEN

LET d = d + 1

FOR j = 1 TO n

IF a(i, j) = "-" THEN

LET c(i, j) = "1"

LET r = r + 1

END IF

NEXT j

IF r = 0 THEN LET d = d - 1

END IF

NEXT i

FOR j = 1 TO n 'определение выигрыша по

вертикали

LET sym = 1

LET zv = 0

FOR i = 1 TO n

IF a(i, j) = xod THEN LET sym = sym + 1

NEXT i

IF sym = n THEN LET zv = 1

IF zv = 1 THEN

LET d = d + 1

FOR i = 1 TO n

IF a(i, j) = "-" THEN

LET c(i, j) = "1"

LET r = r + 1

END IF

NEXT i

IF r = 0 THEN LET d = d - 1

END IF

NEXT j

LET sym = 1 'определение выигрыша по главной

диагонали

LET zv = 0

FOR i = 1 TO n

LET j = i

IF a(i, j) = xod THEN LET sym = sym + 1

IF sym = n THEN LET zv = 1

NEXT i

IF zv = 1 THEN

LET d = d + 1

FOR i = 1 TO n

LET j = i

IF a(i, j) = "-" THEN LET c(i, j) = "1"

NEXT i

END IF

LET sym = 1 'определение выигрыша по побочной

диагонали

LET zv = 0

LET j = n + 1

FOR i = 1 TO n

LET j = j - 1

IF a(i, j) = xod THEN LET sym = sym + 1

IF sym = n THEN LET zv = 1

NEXT i

IF zv = 1 THEN

LET j = n + 1

LET d = d + 1

FOR i = 1 TO n

LET j = j - 1

IF a(i, j) = "-" THEN LET c(i, j) = "1"

NEXT i

END IF

r = 0 'вывод результата

IF d > 0 THEN

FOR i = 1 TO n

FOR j = 1 TO n

IF c(i, j) = "1" THEN

LET r = r + 1

SELECT CASE j ' приведение результата к

стандартному виду

CASE 1

LET c(i, j) = "A" + LTRIM$(STR$(i))

CASE 2

LET c(i, j) = "B" + LTRIM$(STR$(i))

CASE 3

LET c(i, j) = "C" + LTRIM$(STR$(i))

CASE 4

LET c(i, j) = "D" + LTRIM$(STR$(i))

CASE 5

LET c(i, j) = "E" + LTRIM$(STR$(i))

CASE 6

LET c(i, j) = "F" + LTRIM$(STR$(i))

CASE 7

LET c(i, j) = "G" + LTRIM$(STR$(i))

CASE 8

LET c(i, j) = "H" + LTRIM$(STR$(i))

END SELECT

LET k = "*"

LET f = xod

END IF

NEXT j

NEXT i

PRINT #2, LTRIM$(STR$(r))

FOR j = 1 TO n

FOR i = 1 TO n

IF c(i, j) <> "" THEN PRINT #2, f; " "; c(i, j); " "; k

NEXT i

NEXT j

ELSE

PRINT #2, "NO"

END IF

CLOSE 'закрытие каналов

END 'конец

Программа на паскале:

program xolz5;

var

isim:string;

pole:string;

kod:integer;

n:integer;{Размер поля в целом виде }

a:array[1..9, 1..9] of string; {клетки поля позиции фигур}

c:array[1..9, 1..9] of string; {ход фигуры}

z:string;{строка поля}

i:integer;{управляющая переменная цикла}

j:integer;{управляющая переменная цикла}

k:string;{указатель поля}

f:string;{фигура}

d:integer;{разница ходов}

xod:string;{фигура, чья очередь ходить}

sym:integer;{сумма фигур, чья очередь ходить}

zv:integer;{счётчик выигрышной позиции}

r:integer;{разница ходов}

so:integer; {счётчик ноликов}

sx:integer; {счётчик крестиков}

fil1, fil2: text;{описание файловой переменной для работы с

текстовым файлом}

begin

assign(fil1,'input.txt');{файловой переменной fil1

присваивается имя input.txt}

assign(fil2,'output.txt');{файловой переменной fil2

присваивается имя output.txt}

reset(fil1);{открытие файла для чтения}

readln(fil1,z);{чтение размера поля из файла}

val(z,n,kod);{присваивание размеру поля целого значения}

for i:=1 to n do {цикл чтения позиции}

begin

readln(fil1,z);{чтение строки из файла}

for j:=1 to n do

a[i,j]:=copy(z,j,1);{чтение клеток поля из строки}

end;

so:=0; {обнуление счётчиков}

sx:=0;

d:=0;

sym:=0;

zv:=0;

r:=0;

k:='';

for i:=1 to n do {подсчёт количества сделанных ходов}

for j:=1 to n do

begin

if a[i,j]='+' then sx:=sx+1;

if a[i,j]='0' then so:=so+1;

c[i,j]:='';

end;

if sx>so then xod:='0';{определение очерёдности хода}

if so=sx then xod:='+';

for i:=1 to n do {определение выигрыша по горизонтали}

begin

sym:=1;

zv:=0;

for j:=1 to n do

if a[i,j]=xod then sym:=sym+1;

if sym=n then zv:=1;

if zv=1 then

begin

d:=d+1;

for j:=1 to n do

if a[i,j]='-' then

begin

c[i,j]:='1';

r:=r+1;

end;

if r=0 then d:=d-1;

end;

end;

for j:=1 to n do {определение выигрыша по вертикали}

begin

sym:=1;

zv:=0;

for i:=1 to n do

if a[i,j]=xod then sym:=sym+1;

if sym=n then zv:=1;

if zv=1 then

begin

d:=d+1;

for i:=1 to n do

if a[i,j]='-' then

begin

c[i,j]:='1';

r:=r+1;

end;

if r=0 then d:=d-1;

end;

end;

sym:=1; {определение выигрыша по главной

диагонали}

zv:=0;

for i:=1 to n do

begin

j:=i;

if a[i,j]=xod then sym:=sym+1;

if sym=n then zv:=1;

end;

if zv=1 then

begin

d:=d+1;

for i:=1 to n do

begin

j:=i;

if a[i,j]='-' then c[i,j]:='1';

end;

end;

sym:=1; {определение выигрыша по обратной

диагонали}

zv:=0;

j:=n+1;

for i:=1 to n do

begin

j:=j-1;

if a[i,j]=xod then sym:=sym+1;

if sym=n then zv:=1;

end;

if zv=1 then

begin

j:=n+1;

d:=d+1;

for i:=1 to n do

begin

j:=j-1;

if a[i,j]='-' then c[i,j]:='1';

end;

end;

r:=0; {вывод результата}

close(fil1); {закрытие файла для чтения}

rewrite(fil2); {открытие файла для записи}

if d>0 then

begin

for i:=1 to n do

begin

str(i,isim);

for j:=1 to n do

if c[i,j]='1' then

begin

r:=r+1;

case j of

1: c[i,j]:='A'+isim;

2: c[i,j]:='B'+isim;

3: c[i,j]:='C'+isim;

4: c[i,j]:='D'+isim;

5: c[i,j]:='E'+isim;

6: c[i,j]:='F'+isim;

7: c[i,j]:='G'+isim;

8: c[i,j]:='H'+isim;

end;

k:='*';

f:=xod;

end;

end;

writeln(fil2,r);

for j:=1 to n do

for i:=1 to n do

if c[i,j]<>'' then

begin

pole:=f+' '+c[i,j]+' '+k;

writeln(fil2,pole); {вывод хода в файл}

end

end

else

writeln(fil2,'NO'); {вывод в файл сообщения}

close(fil2); {закрытие файла для записи}

end. {конец}

Тесты к 5 задаче:

Входные

данные

Выходные

данные

Комментарий

Балл

ы

1

4

1

1 + Гор

9

-0--

+-++

-0--

-0—

+ B2 *

2

3

-+0

-+0

---

1

+ B3 *

1 + Верт

9

3

5

+--0-

-+-0-

--+0-

-----

---0+

1

+ D4 *

1 + ГД

9

4

4

-0-+

-0+-

----

+0--

1

+ B3 *

1 + ВД

9

5

5

----+

0000-

---++

----+

----+

1

0 E2 *

1 0 Гор

9

6

4

+--0

-+-0

--+0

+---

1

0 D4 *

1 0 Верт

9

7

3

++0

+0-

1

0 A3 *

1 0 ГД

9

8

5

1

1 0 ВД

9

++++-

---0-

--0--

-0---

0---+

0 E1 *

9

5

--+--

+++-+

00-00

--+00

--+-0

2

+ C3 *

+ D2 *

2 +

9

10

4

+00+

0++0

----

+00+

2

+ B3 *

+ C3 *

2 +

9

11

5

00+++

-0+++

-0---

---0-

-0++0

2

0 B4 *

0 C3 *

2 0

9

12

3

0+-

-0+

0++

2

0 A2 *

0 C1 *

2 0

9

13

5

+000+

-+-+0

-----

-+0+0

+0-0+

1

+ С3 *

1 ход, а не

2!

9

14

7

1

1 ход, а не

9

----++0

++++++0

000000-

----++0

-----+0

-----+0

-----+0

0 G3 *

2!

15

4

-+++

--0+

00--

----

No

0 Ход во

9

16

5

+-++-

-+---

0000-

-----

-----

No

0 Ход во

9

17

5

-----

-----

-----

-----

-----

No

0

9

18

4

-+--

0+0-

--+-

----

No

0

9

19

3

-0-

-+0

-+-

No

0

9

20

4

No

0

9

--0-

-0+-

--++

0---

Бонус 70 баллов

Задача 6. Предотвращение проигрыша в один ход

(300 баллов)

Заданное положение таково, что тот игрок, чья очередь

ходить, в случае неудачного хода может проиграть в один ход.

Сделать программу, находящую ходы, предотвращающие

проигрыш. Нужно найти количество таких ходов и сами ходы.

Если таких ходов больше одного, они выдаются в порядке

возрастания наименований колонок, номеров строк. В случае

невозможности предотвратить проигрыш, выдать No.

Входные данные: текущее положение.

Выходные данные: одно число и столько ходов, каково это

число. Всё в отдельной строке.

Примерные тесты:

Номер

теста

1

2

3

Входны

е данные

3

-0-

++-

---

6

+----0

-+--0-

-++0--

--0+--

-0--+-

------

5

+00--

+-00-

++-++

+--00

---+0

Выходн

ые данные

1

0 C2

2

0 A6 *

No

0 F6

Программа на бейсике:

CLS

REM X Заочная олимпиада по программированию

REM задача 6

DIM n AS INTEGER 'объявление

переменных, размер поля

DIM i AS INTEGER 'управляющая

переменная цикла

DIM j AS INTEGER 'управляющая

переменная цикла

DIM sx AS INTEGER 'счётчик крестиков

DIM so AS INTEGER 'счётчик ноликов

DIM d AS INTEGER 'разница ходов

DIM r AS INTEGER 'счётчик ходов

DIM s AS INTEGER 'счётчик ходов

DIM zv AS INTEGER 'счётчик

выигрышной позиции

DIM xod AS STRING 'сходившая фигура

DIM sym AS INTEGER 'сумма фигур, чья

очередь ходить

DIM f AS STRING 'фигура

DIM z AS STRING 'строка поля

OPEN "input.txt " FOR INPUT AS #1 'открытие канала

для чтения

OPEN "output.txt " FOR OUTPUT AS #2 'открытие канала

для записи

INPUT #1, z 'чтение из файла

размера поля

LET n = VAL(z) 'перевод размера

поля в целый вид

DIM a(n, n) AS STRING 'объявление

массивов, позиция фигур

DIM c(n, n) AS STRING 'ход фигуры

DIM k(n, n) AS STRING 'указатель поля

FOR i = 1 TO n

INPUT #1, z 'чтение из файла

строк поля позиции фигур

FOR j = 1 TO n

LET a(i, j) = MID$(z, j, 1) 'чтение из строк

клеток поля позиции фигур

NEXT j

NEXT i

LET sx = 0 'обнуление

счётчиков

LET so = 0

LET s = 0

LET d = 0

LET r = 0

LET sym = 0

LET zv = 0

FOR i = 1 TO n 'подсчёт количества

сделанных ходов

FOR j = 1 TO n

IF a(i, j) = "+" THEN LET sx = sx + 1

IF a(i, j) = "0" THEN LET so = so + 1

LET c(i, j) = ""

LET k(i, j) = ""

NEXT j

NEXT i

IF sx > so THEN LET xod = "0" 'определение

очерёдности хода

IF sx = so THEN LET xod = "+"

LET f = xod

FOR i = 1 TO n 'определение

выигрыша по горизонтали

LET sym = 1

LET zv = 0

FOR j = 1 TO n

IF a(i, j) = xod THEN LET sym = sym + 1

NEXT j

IF sym = n THEN LET zv = 1

IF zv = 1 THEN

LET d = d + 1

FOR j = 1 TO n

IF a(i, j) = "-" THEN

LET c(i, j) = "1"

LET k(i, j) = "*"

END IF

NEXT j

END IF

NEXT i

FOR j = 1 TO n 'определение

выигрыша по вертикали

LET sym = 1

LET zv = 0

FOR i = 1 TO n

IF a(i, j) = xod THEN LET sym = sym + 1

NEXT i

IF sym = n THEN LET zv = 1

IF zv = 1 THEN

LET d = d + 1

FOR i = 1 TO n

IF a(i, j) = "-" THEN

LET c(i, j) = "1"

LET k(i, j) = "*"

END IF

NEXT i

END IF

NEXT j

LET sym = 1 'определение

выигрыша по главной диагонали

LET zv = 0

FOR i = 1 TO n

LET j = i

IF a(i, j) = xod THEN LET sym = sym + 1

IF sym = n THEN LET zv = 1

NEXT i

IF zv = 1 THEN

LET d = d + 1

FOR i = 1 TO n

LET j = i

IF a(i, j) = "-" THEN

LET c(i, j) = "1"

LET k(i, j) = "*"

END IF

NEXT i

END IF

LET sym = 1 'определение

выигрыша по побочной диагонали

LET zv = 0

LET j = n + 1

FOR i = 1 TO n

LET j = j - 1

IF a(i, j) = xod THEN LET sym = sym + 1

IF sym = n THEN LET zv = 1

NEXT i

IF zv = 1 THEN

LET j = n + 1

LET d = d + 1

FOR i = 1 TO n

LET j = j - 1

IF a(i, j) = "-" THEN

LET c(i, j) = "1"

LET k(i, j) = "*"

END IF

NEXT i

END IF

IF xod = "+" THEN LET xod = "0" ELSE xod = "+"

FOR i = 1 TO n

FOR j = 1 TO n

IF c(i, j) = "1" THEN LET s = s + 1

NEXT j

NEXT i

LET d = 0

FOR i = 1 TO n 'определение

выигрыша по горизонтали при ошибке ходящего

LET sym = 1

LET zv = 0

FOR j = 1 TO n

IF a(i, j) = xod THEN LET sym = sym + 1

NEXT j

IF sym = n THEN LET zv = 1

IF zv = 1 THEN

LET d = d + 1

FOR j = 1 TO n

IF a(i, j) = "-" THEN LET c(i, j) = "1"

NEXT j

END IF

NEXT i

FOR j = 1 TO n 'определение

выигрыша по вертикали при ошибке ходящего

LET sym = 1

LET zv = 0

FOR i = 1 TO n

IF a(i, j) = xod THEN LET sym = sym + 1

NEXT i

IF sym = n THEN LET zv = 1

IF zv = 1 THEN

LET d = d + 1

FOR i = 1 TO n

IF a(i, j) = "-" THEN LET c(i, j) = "1"

NEXT i

END IF

NEXT j

LET sym = 1 'определение

выигрыша по главной диагонали при ошибке ходящего

LET zv = 0

FOR i = 1 TO n

LET j = i

IF a(i, j) = xod THEN LET sym = sym + 1

IF sym = n THEN LET zv = 1

NEXT i

IF zv = 1 THEN

LET d = d + 1

FOR i = 1 TO n

LET j = i

IF a(i, j) = "-" THEN LET c(i, j) = "1"

NEXT i

END IF

LET sym = 1 'определение выигрыша по побочной

диагонали при ошибке ходящего

LET zv = 0

LET j = n + 1

FOR i = 1 TO n

LET j = j - 1

IF a(i, j) = xod THEN LET sym = sym + 1

IF sym = n THEN LET zv = 1

NEXT i

IF zv = 1 THEN

LET j = n + 1

LET d = d + 1

FOR i = 1 TO n

LET j = j - 1

IF a(i, j) = "-" THEN LET c(i, j) = "1"

NEXT i

END IF

r = 0 'вывод результата

IF (s = 0) AND (d > 1) THEN

PRINT #2, "NO"

ELSE

FOR i = 1 TO n

FOR j = 1 TO n

IF c(i, j) = "1" THEN

LET r = r + 1

SELECT CASE j ' приведение

результата к стандартному виду

CASE 1

LET c(i, j) = "A" + LTRIM$(STR$(i))

CASE 2

LET c(i, j) = "B" + LTRIM$(STR$(i))

CASE 3

LET c(i, j) = "C" + LTRIM$(STR$(i))

CASE 4

LET c(i, j) = "D" + LTRIM$(STR$(i))

CASE 5

LET c(i, j) = "E" + LTRIM$(STR$(i))

CASE 6

LET c(i, j) = "F" + LTRIM$(STR$(i))

CASE 7

LET c(i, j) = "G" + LTRIM$(STR$(i))

CASE 8

LET c(i, j) = "H" + LTRIM$(STR$(i))

END SELECT

END IF

NEXT j

NEXT i

IF d = 1 THEN

PRINT #2, LTRIM$(STR$(r))

FOR j = 1 TO n

FOR i = 1 TO n

IF c(i, j) <> "" THEN PRINT #2, f; " "; c(i, j); " "; k(i, j)

NEXT i

NEXT j

ELSE

PRINT #2, LTRIM$(STR$(s))

FOR j = 1 TO n

FOR i = 1 TO n

IF (c(i, j) <> "") AND (k(i, j) = "*") THEN PRINT #2, f;

" "; c(i, j); " "; k(i, j)

NEXT i

NEXT j

END IF

END IF

CLOSE 'закрытие каналов

END 'конец

Программа на паскале:

program xolz6;

var

kod:integer;

n:integer; {Размер поля в целом виде}

a:array[1..9, 1..9] of string; {клетки поля первой позиции}

k:array[1..9, 1..9] of string; {указатель поля}

c:array[1..9, 1..9] of string; {клетки поля итоговой позиции}

z:string;{строка поля}

i:integer;{управляющая переменная цикла}

j:integer;{управляющая переменная цикла}

isim:string;{управляющая переменная цикла в символьном

виде}

f:string;{фигура}

d:integer;{разница ходов}

xod:string;{сходившая фигура}

sym:integer;{сумма фигур, чья очередь ходить}

zv:integer;{счётчик выигрышной позиции}

r:integer;{счётчик ходов}

so:integer; {счётчик ноликов}

sx:integer; {счётчик крестиков}

s:integer; {счётчик ходов}

fil1, fil2: text;{описание файловой переменной для работы с

текстовым файлом}

begin

assign(fil1,'input.txt');{файловой переменной fil1

присваивается имя input.txt}

assign(fil2,'output.txt');{файловой переменной fil2

присваивается имя output.txt}

reset(fil1);{открытие файла для чтения}

readln(fil1,z);{чтение размера поля из файла}

val(z,n,kod);{присваивание размеру поля целого значения}

for i:=1 to n do {цикл чтения позиции}

begin

readln(fil1,z);{чтение строки из файла}

for j:=1 to n do

a[i,j]:=copy(z,j,1);{чтение клеток поля из строки}

end;

sx:=0; {обнуление счётчиков}

so:=0; {обнуление счётчиков}

s:=0; {обнуление счётчиков}

d:=0; {обнуление счётчиков}

r:=0; {обнуление счётчиков}

sym:=0; {обнуление счётчиков}

zv:=0; {обнуление счётчиков}

for i:=1 to n do {проверка очерёдности хода}

for j:=1 to n do

begin

if a[i,j]='+' then sx:=sx+1;

if a[i,j]='0' then so:=so+1;

c[i,j]:='';

k[i,j]:='';

end;

if sx>so then xod:='0';

if so=sx then xod:='+';

f:=xod;

for i:=1 to n do {определение выигрышной позиции по

горизонтали}

begin

sym:=1;

zv:=0;

for j:=1 to n do

if a[i,j]=xod then sym:=sym+1;

if sym=n then zv:=1;

if zv=1 then

begin

d:=d+1;

for j:=1 to n do

if a[i,j]='-' then

begin

c[i,j]:='1';

k[i,j]:='*';

end;

end;

end;

for j:=1 to n do {проверка выигрышной позиции по

вертикали}

begin

sym:=1;

zv:=0;

for i:=1 to n do

if a[i,j]=xod then sym:=sym+1;

if sym=n then zv:=1;

if zv=1 then

begin

d:=d+1;

for i:=1 to n do

if a[i,j]='-' then

begin

c[i,j]:='1';

k[i,j]:='*';

end;

end;

end;

sym:=1; {проверка выигрышной позиции по главной

диагонали}

zv:=0;

for i:=1 to n do

begin

j:=i;

if a[i,j]=xod then sym:=sym+1;

if sym=n then zv:=1;

end;

if zv=1 then

begin

d:=d+1;

for i:=1 to n do

begin

j:=i;

if a[i,j]='-' then

begin

c[i,j]:='1';

k[i,j]:='*';

end;

end;

end;

sym:=1; {проверка выигрышной позиции по обратной

диагонали}

zv:=0;

j:=n+1;

for i:=1 to n do

begin

j:=j-1;

if a[i,j]=xod then sym:=sym+1;

if sym=n then zv:=1;

end;

if zv=1 then

begin

d:=d+1;

j:=n+1;

for i:=1 to n do

begin

j:=j-1;

if a[i,j]='-' then

begin

c[i,j]:='1';

k[i,j]:='*';

end;

end;

end;

if xod='+' then xod:='0' else xod:='+'; {определение

выигрыша, при ошибке ходящего}

for i:=1 to n do

for j:= 1 to n do

if c[i,j]='1' then s:=s+1;

d:=0;

for i:=1 to n do {определение выигрышной позиции по

горизонтали, при ошибке ходящего}

begin

sym:=1;

zv:=0;

for j:=1 to n do

if a[i,j]=xod then sym:=sym+1;

if sym=n then zv:=1;

if zv=1 then

begin

d:=d+1;

for j:=1 to n do

if a[i,j]='-' then c[i,j]:='1';

end;

end;

for j:=1 to n do {проверка выигрышной позиции по

вертикали, при ошибке ходящего}

begin

sym:=1;

zv:=0;

for i:=1 to n do

if a[i,j]=xod then sym:=sym+1;

if sym=n then zv:=1;

if zv=1 then

begin

d:=d+1;

for i:=1 to n do

if a[i,j]='-' then c[i,j]:='1';

end;

end;

sym:=1; {проверка выигрышной позиции по главной

диагонали, при ошибке ходящего}

zv:=0;

for i:=1 to n do

begin

j:=i;

if a[i,j]=xod then sym:=sym+1;

if sym=n then zv:=1;

end;

if zv=1 then

begin

d:=d+1;

for i:=1 to n do

begin

j:=i;

if a[i,j]='-' then c[i,j]:='1';

end;

end;

sym:=1; {проверка выигрышной позиции по обратной

диагонали, при ошибке ходящего}

zv:=0;

j:=n+1;

for i:=1 to n do

begin

j:=j-1;

if a[i,j]=xod then sym:=sym+1;

if sym=n then zv:=1;

end;

if zv=1 then

begin

d:=d+1;

j:=n+1;

for i:=1 to n do

begin

j:=j-1;

if a[i,j]='-' then c[i,j]:='1';

end;

end;

close(fil1); {закрытие файла для чтения}

rewrite(fil2); {открытие файла для записи}

r:=0;{вывод результата}

if (s=0) and (d>1) then

writeln(fil2,'NO') {вывод в файл сообщения}

else

for i:=1 to n do {приведение результата к стандартному

виду}

for j:=1 to n do

if c[i,j]='1' then

begin

r:=r+1;

case j of

1: begin

str(i,isim);

c[i,j]:='A'+isim;

end;

2: begin

str(i,isim);

c[i,j]:='B'+isim;

end;

3: begin

str(i,isim);

c[i,j]:='C'+isim;

end;

4: begin

str(i,isim);

c[i,j]:='D'+isim;

end;

5: begin

str(i,isim);

c[i,j]:='E'+isim;

end;

6: begin

str(i,isim);

c[i,j]:='F'+isim;

end;

7: begin

str(i,isim);

c[i,j]:='G'+isim;

end;

8: begin

str(i,isim);

c[i,j]:='H'+isim;

end;

end;

if d=1 then

begin

writeln(fil2,r); {вывод хода в файл}

for j:= 1 to n do

for i:= 1 to n do

if c[i,j]<>'' then writeln(fil2,f,' ',c[i,j],' ',k[i,j]);

end;

if d<>1 then

begin

writeln(fil2,s); {вывод хода в файл}

for j:=1 to n do

for i:= 1 to n do

if (c[i,j]<>'') and (k[i,j]='*') then writeln(fil2,f,' ',c[i,j],'

',k[i,j]);

end;

close(fil2) {закрытие файла для записи}

end. {конец}

Тесты к 6 задаче:

Входные

данные

Выходные

данные

Комментарий

Балл

ы

1

5

+++--

-----

000-0

1

+ D

1 + гор пер

7,5

-----

-+---

2

4

-0--

+0+-

----

-0+-

1

+ B3

1 + верт

пер

7,5

3

5

0++++

-0---

--0--

---0-

-----

1

+ E5

1 + ГД пер

7,5

4

5

++++-

---0-

--0--

-0---

0----

1

+ E1 *

1 + вд пер

7,5

5

4

----

+-++

----

00—

1

0 B2

1 0 гор пер

7,5

6

5

-0+--

-0+--

-0+--

-----

--+--

1

0 C4

1 0 верт пер

7,5

7

3

+--

0+-

---

1

0 C3

1 0 ГД пер

7,5

8

4

00--

--+-

-+--

+---

1

0 D1

1 0 вд пер

7,5

9

5

----0

----0

++++-

----0

----0

1

+ E3 *

1 + гор выиг

7,5

10

5

----+

----+

----+

----+

0000-

1

+ E5 *

1 + верт

выиг

7,5

11

4

+++-

--0-

-0--

0---

1

+ D1 *

1 + вД выиг

7,5

12

4

+--0

-+-0

--+0

----

1

+ D4 *

1 + гд выиг

7,5

13

6

00000-

----++

---+--

1

0 F1 *

1 0 гор выиг

7,5

--+---

-+----

+-----

14

5

+---0

-+--0

--+-0

---+0

--+--

1

0 E5 *

1 0 верт выиг

7,5

15

7

0------

-0-----

--0----

---0---

----0--

-----0+

++++++-

1

0 G7 *

1 0 ГД выиг

7,5

16

8

+++++++-

------0+

-----0--

----0---

---0----

--0-----

-0------

0-------

1

0 H1 *

1 0 вд выиг

7,5

17

6

--0---

--0---

00000-

No

No + гор

7,5

---+++

--0+++

--0+++

18

8

0-------

0-------

0000-000

0+++++++

0++++++-

--------

0-------

0-------

No

No + верт

7,5

19

8

0------0

-0----0-

++0++0++

---00---

+++--+++

-+0-+0--

-0----0-

0------0

No

No + ГД

7,5

20

8

+++++++0

++++++0-

0000-000

----0---

--------

--0-----

-0------

0-------

No

No + вд

7,5

21

8

--------

--------

000000--

No

No 0 гор

7,5

+++++++-

+++++++-

000000--

----00--

--------

22

8

-++00000

-++00000

-++000--

-++-----

-++-----

-++-----

-++-----

--------

No

No 0 верт

7,5

23

8

++000000

-+000000

-++-----

-+-+----

-+--+---

-+---+--

-+----+-

--------

No

No 0 ГД

7,5

24

8

+000000-

-+0000+-

--+00+--

---++0--

---++---

--+--+--

-+----+-

+-------

No

No 0 вд

7,5

25

8

+++++++-

4

+ H1 *

4+ в в

7,5

0000000-

+++++++-

0000000-

--------

--------

--------

--------

+ H2

+ H3 *

+ H4

26

8

0------+

00----++

0-0--+-+

0--0+--+

0--+0--+

0-+--0-+

-+----0+

0-------

2

+ A7

+ H8 *

2 + в п

7,5

27

7

+-----0

+---+00

+---0+0

+--0+-0

+-0+--0

+0+--+0

-------

2

0 A7 *

0 G7 *

2 0 в в

7,5

28

5

--0+-

--0+-

--0--

--0+-

---+-

2

0 C5

0 D3 *

2 0 в п

7,5

29

8

-+++++++

+0000000

+00-----

1

+ A1 *

7,5

+--0----

+---0---

+----0--

+-----0-

+------0

30

7

0--+--0

-0-+-0-

--0+0+-

+++-+++

--0+0--

-0-+-0-

0--+--0

1

0 D4 *

7,5

Бонус 75 баллов

Задача 7. Защита от дурака (200 баллов)

Дано текущее положение.

Сделать программу, определяющую корректность входных

данных. В случае корректности вывести 1, иначе 0.

Входные данные: текущее положение.

Выходные данные: одно число.

Примерные тесты:

Номер теста

1

2

3

4

5

Входные данные

3

----

-0--

---+

----

4

-00-

-+--

--0-

----

3

-+-

0-2

---

4

-+--

--0-

----

4

0---

----

--+-

----

Выходные данные

0

0

0

0

1

Программа на бейсике:

CLS

REM X Заочная олимпиада по программированию

REM задача 7

DIM n AS INTEGER 'объявление переменных,

размер пoля

DIM i AS INTEGER 'управляющая переменная

цикла

DIM j AS INTEGER 'управляющая переменная

цикла

DIM sx AS INTEGER 'счётчик крестиков

DIM so AS INTEGER 'счётчик ноликов

DIM r AS INTEGER 'счётчик строк

DIM s AS INTEGER 'счётчик столбцов

DIM d AS INTEGER 'счётчик

DIM x AS STRING 'сходившая фигура

DIM f AS STRING 'фигура

DIM z AS STRING 'строка поля

OPEN "input.txt " FOR INPUT AS #1 'открытие канала для

чтения

OPEN "output.txt " FOR OUTPUT AS #2 'открытие канала

для записи

INPUT #1, z 'чтение из файла размера поля

IF z = "" THEN

f = "0"

ELSE

n = LEN(z)

IF n > 1 THEN

FOR i = 1 TO n

x = MID$(z, 1, 1)

IF VAL(x) = 0 THEN f = "0"

IF f = "0" THEN EXIT FOR

NEXT i

END IF

LET n = VAL(z) 'перевод размера поля в

целый вид

DIM a(n, n) AS STRING 'объявление массивов,

позиция фигур

DIM k(10) AS STRING 'строка поля

LET s = 0 'обнуление счётчикa

IF (n > 8) AND (f = "") THEN f = "0"'проверка размера

поля

DO UNTIL EOF(1)

IF f = "0" THEN EXIT DO

s = s + 1

INPUT #1, k(s)

LOOP

IF (n <> s) AND (f = "") THEN f = "0"'проверка количествa

строк

FOR i = 1 TO n

IF f = "0" THEN EXIT FOR

LET r = LEN(k(i))

IF (n <> r) AND (f = "") THEN f = "0"'проверка

количествa столбцов

FOR j = 1 TO r

IF f = "0" THEN EXIT FOR

LET a(i, j) = MID$(k(i), j, 1)'чтение из строк клеток

поля позиции фигур

NEXT j

NEXT i

LET sx = 0 'обнуление счётчиков

LET so = 0

LET d = 0

FOR i = 1 TO n 'подсчёт количества сделаных

ходов

IF f = "0" THEN EXIT FOR

FOR j = 1 TO n

IF a(i, j) = "+" THEN LET sx = sx + 1

IF a(i, j) = "0" THEN LET so = so + 1

NEXT j

NEXT i

IF (sx - so > 1) AND (f = "") THEN f = "0" 'определение

очерёдности хода

IF (so > sx) AND (f = "") THEN f = "0"

FOR i = 1 TO n

IF f = "0" THEN EXIT FOR

FOR j = 1 TO n

IF f = "0" THEN EXIT FOR

IF a(i, j) <> "+" THEN 'определение лишних

симвoлов

IF a(i, j) <> "0" THEN

IF a(i, j) <> "-" THEN LET f = "0"

END IF

END IF

NEXT j

NEXT i

FOR i = 1 TO n 'определение количества

выигрышей по горизонтали

IF f = "0" THEN EXIT FOR

s = 0

FOR j = 1 TO n

IF f = "0" THEN EXIT FOR

IF a(i, j) = "+" THEN s = s + 1

NEXT j

IF s = n THEN d = d + 1

NEXT i

FOR i = 1 TO n

IF f = "0" THEN EXIT FOR

s = 0

FOR j = 1 TO n

IF f = "0" THEN EXIT FOR

IF a(i, j) = "0" THEN s = s + 1

NEXT j

IF s = n THEN d = d + 1

NEXT i

IF d > 1 THEN f = "0"

LET d = 0 'определение количества

выигрышей по вертикали

FOR j = 1 TO n

IF f = "0" THEN EXIT FOR

s = 0

FOR i = 1 TO n

IF f = "0" THEN EXIT FOR

IF a(i, j) = "+" THEN s = s + 1

NEXT i

IF s = n THEN d = d + 1

NEXT j

FOR j = 1 TO n

IF f = "0" THEN EXIT FOR

s = 0

FOR i = 1 TO n

IF f = "0" THEN EXIT FOR

IF a(i, j) = "0" THEN s = s + 1

NEXT i

IF s = n THEN d = d + 1

NEXT j

IF d > 1 THEN f = "0"

IF f = "" THEN f = "1"

END IF

PRINT #2, LTRIM$(f)

CLOSE 'закрытие каналов

END 'конец

Программа на паскале:

program xolz7;

var

kod:integer;

n:integer; {Размер поля в целом виде}

a:array[1..9, 1..9] of string; {клетки поля первой позиции}

k:array[1..10] of string; {указатель поля}

z:string;{строка поля}

i:integer;{управляющая переменная цикла}

j:integer;{управляющая переменная цикла}

f:string;{фигура}

d:integer;{разница ходов}

x:string;{сходившая фигура}

r:integer;{счётчик ходов}

so:integer; {счётчик ноликов}

sx:integer; {счётчик крестиков}

s:integer; {счётчик ходов}

fil1, fil2: text;{описание файловой переменной для работы с

текстовым файлом}

begin

assign(fil1,'input.txt');{файловой переменной fil1

присваивается имя input.txt}

assign(fil2,'output.txt');{файловой переменной fil2

присваивается имя output.txt}

reset(fil1);{открытие файла для чтения}

readln(fil1,z);{чтение размера поля из файла}

if z='' then {проверка на пустой файл}

f:='0'

else

begin

n:=length(z); {проверка первой строки}

if n>0 then

for i:=1 to n do

begin

x:=copy(z,1,1);

val(x,d,kod);

if d=0 then f:='0';

if f='0' then break

end;

val(z,n,kod);{присваивание размеру поля целого

значения}

s:=0;

if (n>8) and (f='') then f:='0'; {проверка размера поля}

while not eof(fil1) do

begin

if f='0' then break;

s:=s+1;

readln(fil1,k[i]);

end;

if (n<>s) and (f='') then f:='0'; {проверка строк поля}

for i:=1 to n do {проверка столбцов поля}

begin

if f='0' then break;

r:=length(k[i]);

if (n<>r) and (f='') then f:='0';

for j:=1 to n do

begin

if f='0' then break;

a[i,j]:=copy(k[i],j,1);{чтение клеток поля из

строки}

end;

end;

sx:=0; {обнуление счётчика}

so:=0; {обнуление счётчика}

d:=0; {обнуление счётчика}

for i:=1 to n do {проверка очерёдности хода}

begin

if f='0' then break;

for j:=1 to n do

begin

if a[i,j]='+' then sx:=sx+1;

if a[i,j]='0' then so:=so+1;

end;

end;

if (sx-so>1) and (f='') then f:='0';

if (so>sx) and (f='') then f:='0';

for i:=1 to n do {проверка на лишний символ}

begin

if f='0' then break;

for j:=1 to n do

begin

if f='0' then break;

if a[i,j]<>'+' then

if a[i,j]<>'0' then

if a[i,j]<>'-' then f:='0';

end;

end;

for i:=1 to n do {проверка количества выигрышных

позиций}

begin

if f='0' then break;

s:=0;

for j:=1 to n do

begin

if f='0' then break;

if a[i,j]='+' then s:=s+1;

end;

if s=n then d:=d+1;

end;

for i:=1 to n do {проверка количества выигрышных

позиций}

begin

if f='0' then break;

s:=0;

for j:=1 to n do

begin

if f='0' then break;

if a[i,j]='0' then s:=s+1;

end;

if s=n then d:=d+1;

end;

if d>1 then f:='0';

d:=0;

for j:=1 to n do {проверка количества выигрышных

позиций}

begin

if f='0' then break;

s:=0;

for i:=1 to n do

begin

if f='0' then break;

if a[i,j]='+' then s:=s+1;

end;

if s=n then d:=d+1;

end;

for j:=1 to n do {проверка количества выигрышных

позиций}

begin

if f='0' then break;

s:=0;

for i:=1 to n do

begin

if f='0' then break;

if a[i,j]='0' then s:=s+1;

end;

if s=n then d:=d+1;

end;

if d>1 then f:='0';

if f='' then f:='1';

end;

close(fil1); {закрытие файла для чтения}

rewrite(fil2); {открытие файла для записи}

writeln(fil2,f); {вывод результата в файл}

writeln(f);

readln;

close(fil2) {закрытие файла для записи}

end. {конец}

Тесты к 7 задаче:

Входные

данные

Выходные

данные

Комментарий

Баллы

1

A

---

-+-

--0

0

Непр 1-я строка

Не число

6

2

3 2

---

-+0

---

0

Непр 1-я строка

Более 1 числа

6

3

9

----+0---

---------

---------

---------

---------

---------

---------

---------

---------

0

>8

6

4

0

Пустой файл

6

5

4

----

-+--

0

< строк

6

--0-

6

4

----

----

--+-

---0

----

0

> строк

6

7

5

-----

-----

---0-

--+-

-----

0

< колонок

6

8

5

-----

-----

---0-

--+---

-----

0

> колонок

6

9

4

----

---0

--+-

---/

0

Недоп симв

6

10

4

----

-+-+

--0-

+---

0

Несоотв + 0

6

11

5

-----

--+00

0

Несоотв + 0

6

-----

-----

-----

12

3

---

-0-

---

0

Несоотв + 0

6

13

6

++++++

000000

------

------

------

------

0

Одновр выигрыш

6

14

8

--------

++++++++

++++++++

0000000-

0-------

0000000-

0-------

--------

0

Два незав

выигрыша+

6

15

8

0-++++-0

0-++++-0

0-++++-0

0-++++-0

0------0

0------0

0------0

0------0

0

Два незав

выигрыша0

6

16

7

-------

1

6

-------

-------

-------

-------

-------

-------

17

7

+0---0+

0+--0+-

-0+0+--

--0+---

-0+0+--

0+--0+-

+----0+

1

6

18

7

-------

----+--

------0

--+0---

-------

-------

+0+0+0+

1

6

19

7

+0+0+0-

+0+0+0-

0+0++0-

-------

-------

-------

-------

1

6

20

8

000+0000

000+0000

1

6

---+----

++++++++

---+----

---+----

---+----

---+----

21

4

---+

-+--

0-0-

---+

1

6

22

5

-----

-+---

--00-

---+-

-----

1

6

23

3

-00

-++

+--

1

6

24

4

----

----

-0+-

----

1

6

25

6

------

------

--+---

---0--

----+-

------

1

6

Бонус 50 баллов

Заключение

Авторы выражают надежду, что данный разбор будет

интересен и полезен коллегам, обучающим юных

программистов.

Литература

Зайдельман Я. Н. «Буки программирования». Материалы

Роботландского университета//Информатика

1

. № 48/1999, №2,

17/2000, № 2/2000.

Златопольский Д. М. Сборник задач по программированию для

школьников//Информатика.-2000.-№4-10, 14, 15, 18, 19.

Кузнецкий Е. М. О динамическом программировании.

//Информатика.-2000.-№ 1.

Олимпиады по программированию для школьников

центрального округа г. Москвы//Информатика.-2000.-№12.

Ананьева В. А. От QBasic к Visual Basic//Информатика и

образование.-2003.-№12.

Андреева Е. В. Олимпиады по информатике. Путь к вершине/

Андреева Е. В. //Информатика.-2001.-№38, 2001., №8, 2002,

2003.-№6.

Гладков В. П. Вопросы, задания и контрольные работы для

начинающих программистов //Информатика.-2001.-№38.

Бочкин А. И. Моделирование операций и функций на ЭВМ

//Информатика и образование.-2002.-№7.

Брызгалов Е. В. Разбор арифметических выражений//

Информатика и образование.-2000.-№10.

Семёнова Е. Е. Исследование функции RND// Информатика и

образование.-2000.-№10.

Пинаев В. Н. Рыбинская олимпиада по программированию/

Информатика и образование.-2000.-№10.

1



Газета «информатика», еженедельное приложение к газете «Первое сентебря»

Левченко И. В. Использование структурных схем при

обучении основам алгоритмизации// Информатика и

образование.-2003.-№5.

Бурцева Г. А. Графика в обучении программированию//

Информатика и образование.-2002.-№6.

Глазков В. В. Программное обучение алгоритмическим

языкам// Информатика и образование.-2002.-№6

Козырева Н. Н. Изучаем тему алгоритмы и исполнители//

Информатика и образование.-2003.-№2.

Ефимов В. Простая программа для решения квадратных

уравнений на языке Visual Basic// Информатика и

образование.-2001.-№46.

Окулов С. М. Основы программирования //Информатика.-

№42,43/2000,2001. №10,11

Гладков В. П. Вопросы, задания и контрольные работы для

начальных программистов //Информатика.-2002.-№5.

Пустоваченко Н. Н. Коллоквиум по решению задач

повышенной сложности //Информатика.-2003.-№7.

Олимпиады по программированию для школьников

центрального округа г. Москвы//Информатика.-2000.-№12.

Златопольский Д. М. Дружественные числа //Информатика.-

1998.-№ 5.

Капустина Е. Н., Абрамов С. А., Гнездилова Г. Г. Задачи по

программированию //Информатика.-2003.-№7.

Носов В. А. О понятиях алгоритма/Носов В. А.

//Информатика.-1998.-№ 33.

Ананьев В. А. Технология подготовки и решения задач на

компьютере. // Информатика и образование.-1999.-№1.

Златопольский Д. М. Примеры алгоритмов с рекурсией //

Информатика и образование.-1999.-№1.

Рейнгольд Г. Б. «Арнументы и результаты»(сборник

методических статей для учителей математики и информатики

ИГПУ «Теория и практика преподавания математики и

информатики. Выпуск 2», Иркутск, 2001)

Рейнгольд Г. Б., Рейнгольд Г. Б. «Тестирование, как важный

этап работы над программой».(«Проблемы развития

мышления в процессе преподавания математики и

информатики». Материалы X межрегиональной научно-

практической конференции преподавателей школ,

инновационных учебных заведений и вузов. ИГПУ, Иркутск,

2003.)

Рейнгольд Г. Б., Рейнгольд Г. Б., Юркевич А. Н., Курзыбова Я.

В. «Заочные олимпиады – важный этап подготовки юных

программистов».(«Совершенствование методов преподавания

математики и информатики в условиях модернизации

Российского образования». Материалы XI межрегиональной

научно-практической конференции преподавателей школ,

инновационных учебных заведений и вузов. ИГПУ, Иркутск,

2004.)

Рейнгольд Г. Б., Рейнгольд Г. Б., Юркевич А. Н., Курзыбова Я.

В. «Играем в программистов!».(Методические рекомендации

по подготовке юных программистов. Иркутский ОЦТТУ,

Иркутск, 2004.)

Рейнгольд Г. Б., Рейнгольд Г. Б., Юркевич А. Н. «V областная

заочная олимпиада по программированию среди учащихся

общего, профессионального и дополнительного образования

«Играем в программистов» «Шпиономания(шифрование и

дешифрование)»».(«Проблемы образования на современном

этапе». Материалы XII межрегиональной научно-

практической конференции преподавателей школ,

инновационных учебных заведений и вузов. ИГПУ, Иркутск,

2005.)

Рейнгольд Г. Б., Рейнгольд Г. Б., Юркевич А. Н. Заочные

олимпиады «Играем в программистов». Шестилетняя

история».(«Современные информационные образовательные

технологии. Материалы XIV межрегиональной научно-

практической конференции преподавателей школ,

инновационных учебных заведений и вузов. ИГПУ, Иркутск,

2007.)

Рейнгольд Г. Б., Рейнгольд Г. Б., Юркевич А. Н. «Играем в

программистов!(второй выпуск)».(Материалы областных

заочных олимпиад по программированию среди учащихся

общего, профессионального и дополнительного образования.

ОГОУ ДОД ЦДТТ, 2008.)

Семакин И. Г., Шестаков А. П. Основы программирования:

Учебник/-М.: Мастерство: Высш. шк., 2001

Черных Е. Ю. Программирование (Объектно-

ориентированное): Методические рекомендации/- Иркутск:

ИГПУ, 2003.- 50 с.

Немнюгин С. А. Turbo Pascal: Учебное пособие/- СПб.: Питер,

2001

Федоренко Ю. «Алгоритмы и программы на QBasic», учебный

курс, «Питер», Санкт-Петербург-Москва-Харьков-Минск, 2002

Мельникова О. И., Бонюшкин «Начала программирования на

языке QBasic», издательство «ЭКОМ», Москва, 2000

Бобровский С. «Программирование на языке QBasic для

школьников и студентов», «Десс» «Информ-Пресс», Москва,

1999

Гутман Т. «Изучаем QBasic», «Питер», Санкт-Петербург-

Москва-Харьков-Минск, 2002

Ушаков Д. М., Юркова Т. А. Паскаль для школьников.- СПб.:

Лидер, 2010.-256 с.: ил.

Содержание

От авторов …………………………………………… 3

X олимпиада по программированию ……………… 4

Задача 1 ……………………………………………… 6

Задача 2 …………………………………………..… 11

Задача 3 …………………………..………………… 15

Задача 4 ………………………………………………19

Задача 5 ……………………..……………………… 35

Задача 6 ………………………………………..…… 50

Задача 7 …………………………..………………… 73

Заключение ………………………………………… 87

Литература …………………………………………. 87

Министерство образования Иркутской области

Государственное автономное учреждение

Дополнительного образования Иркутской области

«Центр развития дополнительного образования детей»

664007, г. Иркутск, ул. Красноказачья 9, тел. (3952)20-87-97

Муниципальное образовательное учреждение

дополнительного образования детей

«Центр детского технического творчества»

664056, г. Иркутск, ул. Театральная 21, тел. (3952)46-91-44

Сайт олимпиады: «htths://vk/com/zolio»

Учебное пособие

Рейнгольд Григорий Борисович,

Юркевич Александр Никитич,

Рейнгольд Михаил Григорьевич.

«Играем в программистов!»

Материалы х заочной олимпиады по программированию среди

учащихся общего, профессионального и дополнительного

образования

Компьютерный набор, вёрстка и оформление авторов

Ответственный за выпуск зам. Директора по УМР ГАУ ДО ИО

ЦРДОД



В раздел образования