Авторы: Юркевич Александр Никитич, Рейнгольд Григорий Борисович
Должность: педагог дополнительного образования
Учебное заведение: ГАУ ДО Иркутской области и педагог дополнительного образования МБУ ДО г. Иркутска ЦДТТ
Населённый пункт: г. Иркутск
Наименование материала: Учебное пособие
Тема: «Играем в программистов!»
Раздел: дополнительное образование
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
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»
Учебное пособие
Рейнгольд Григорий Борисович,
Юркевич Александр Никитич,
Рейнгольд Михаил Григорьевич.
«Играем в программистов!»
Материалы х заочной олимпиады по программированию среди
учащихся общего, профессионального и дополнительного
образования
Компьютерный набор, вёрстка и оформление авторов
Ответственный за выпуск зам. Директора по УМР ГАУ ДО ИО
ЦРДОД