Задачи личного первенства 1997 весна
1. Число прописью (1-2 курс)
Для платежного поручения и других бухгалтерских задач
часто требуется печать числа прописью.
Напишите программу, которая считывает числа из входного файла
и выводит грамматически правильные названия этих
чисел в выходной файл. Числа во входном файле по значению
не превосходят 2 миллиардов.
Пример ввода
1234567890
21001
0
2
Пример вывода
один миллиард двести тридцать четыре миллиона пятьсот шестьдесят семь тысяч восемьсот девяносто рублей
двадцать одна тысяча один рубль
ноль рублей
два рубля
Примечание: Для проверки окончания файла используйте результат,
возвращаемый fscanf – количество введенных данных (т.е. вернется 0 при обнаружении конца файла во время ввода).
2. Реверси (1-2 курс)
Игра реверси (Отелло) ведется на доске 8x8 фишками окрашенными в в два цвета (одна сторона фишек черная, другая белая). Допустимым ходом игрока считается ход в пустую клетку
доски, при котором происходит переворот (изменение цвета) фи-
шек противника. Переворачиваются те фишки противника, которые
находятся между только что поставленной фишкой и уже стоящими
на доске фишками игрока, без пустых промежутков, в горизонтальном, вертикальном и диагональных направлениях.
До: После:
XO OOXOOXOOX XO OOXXXXOOX
^ ^
только что
поставленная фишка
Если никаких фишек не переворачивается, ход недопустим.
Если допустимых ходов нет, игрок должен пасовать. Выигрывает
тот, у кого после завершения игры (полного заполнения поля или
оба игрока не могут ходить) больше фишек его цвета.
Написать программу, которая вводит текущее состояние доски и ход игрока из входного файла, переворачивает фишки согласно правилам и выводит новое состояние доски в выходной файл. Если ход не является допустимым, выводится только
сообщение "НЕДОПУСТИМЫЙ ХОД".
Пустые клетки доски обозначаются символом '.', белые фишки – 'O', черные фишки – 'X'. Для хода указывается выполняющий ход игрок и координаты клетки.
Пример ввода
.....X..
...OO...
....OO.X
...OX...
XOOOXOX.
...X..O.
...O...X
...X....
XD6
Пример вывода
.....X..
...OX...
...XOO.X
...XX...
XOOXXOX.
...X..O.
...O...X
...X....
3. Задача о переливании (1-2 курс)
Найти решение известной головоломки о переливании за наименьшее число ходов.
Во входном файле в первой строке находятся 3 целых числа:
1) Емкость 1 сосуда
2) Емкость 2 сосуда
3) Емкость 3 сосуда
Во второй строке находятся 3 следущих числа:
1) Начальное количество жидкости в 1 сосуде
2) Начальное количество жидкости во 2 сосуде
3) Начальное количество жидкости в 3 сосуде
В третьей строке находятся 3 следущих числа:
1) Конечное количество жидкости в 1 сосуде
2) Конечное количество жидкости во 2 сосуде
3) Конечное количество жидкости в 3 сосуде
Сумма количеств во второй и третьей строке равны – жидкость нельзя проливать!
В выходной файл нужно вывести последовательность изменений количества жидкости в сосудах. (Первая и последняя строка соответствуют второй и третьей строке входного файла).
Пример ввода
5 3 100
0 0 100
4 0 96
Пример вывода
0 0 100
5 0 95
2 3 95
2 0 98
0 2 98
5 2 93
4 3 93
4 0 96
4. Транслятор с языка мини-Бейсик на Си (3-4 курс)
Язык мини-Бейсик можно описать следующим образом:
строка :=: метка оператор
оператор :=: REM текст
| PRINT "текст"
| PRINT выражение
| INPUT переменная
| LET переменная = выражение
| GOTO метка
| IF выражение ==|!=|>=|>|<|<= выражение THEN метка
| GOSUB метка
| RETURN
| END
выражение :=: число
| переменная
| ( выражение )
| выражение +|-|*|/ выражение
числа и метки – это целые числа (не превосходящие 32767).
переменные – это 1 (одна!) буква от A до Z (т.е. всего 26 ЦЕЛЫХ
переменных)
Во входном файле находится синтаксически правильная
программа на языке мини-Бейсик (до 100 строк). Метки операторов идут в порядке возрастания. Глубина вызова подпрограмм не
превосходит 10. Последним оператором программы является END.
Ключевые слова и имена переменных написаны прописными буквами
(как в примерах).
В выходном файле должен находиться текст программы на
языке Си, которая выполняет действия, описанные программой на
языке мини-Бейсик.
Пример ввода
10 PRINT "Введи число:"
20 INPUT N
25 LET S=0
30 LET I = 1
35 IF I>N THEN 60
40 LET S = S + I
50 LET I = I + 1
55 GOTO 35
60 PRINT "Результат вычислений:"
70 PRINT S
100 END
Пример вывода (может сильно отличаться от вашего вывода)
int main()
{
int N,S,I;
printf("%s\n","Введи число:");
scanf("%d",&N);
S=0;
for(I=1;I<=N;I++)
S=S+I;
printf("%s\n","Результат вычислений:");
printf("%d\n",S);
exit(0);
}
Другой пример программы для тестирования:
LUNAR.BAS
10 REM Lunar Lander
20 REM By Diomidis Spinellis
30 PRINT "You aboard the Lunar Lander about to leave the spacecraft."
60 GOSUB 4000
70 GOSUB 1000
80 GOSUB 2000
90 GOSUB 3000
100 LET H = H - V
110 LET V = ((V + G) * 10 - U * 2) / 10
120 LET F = F - U
130 IF H > 0 THEN 80
135 LET H = 0
140 GOSUB 2000
150 IF V > 5 THEN 200
160 PRINT "Congratulations! This was a very good landing."
170 GOSUB 5000
180 GOTO 10
200 PRINT "You have crashed."
210 GOTO 170
1000 REM Initialise
1010 LET V = 70
1020 LET F = 500
1030 LET H = 1000
1040 LET G = 2
1050 RETURN
2000 REM Print values
2010 PRINT " Meter readings"
2015 PRINT " --------------"
2020 PRINT "Fuel (gal):"
2030 PRINT F
2040 GOSUB 2100 + 100 * (H != 0)
2050 PRINT V
2060 PRINT "Height (m):"
2070 PRINT H
2080 RETURN
2100 PRINT "Landing velocity (m/sec):"
2110 RETURN
2200 PRINT "Velocity (m/sec):"
2210 RETURN
3000 REM User input
3005 IF F == 0 THEN 3070
3010 PRINT "How much fuel will you use?"
3020 INPUT U
3025 IF U < 0 THEN 3090
3030 IF U <= F THEN 3060
3040 PRINT "Sorry, you have not got that much fuel!"
3045 PRINT F
3050 GOTO 3010
3060 RETURN
3070 LET U = 0
3080 RETURN
3090 PRINT "No cheating please! Fuel must be >= 0."
3100 GOTO 3010
4000 REM Detachment
4005 PRINT "Ready for detachment"
4007 PRINT "-- COUNTDOWN --"
4010 LET I = 1
4015 IF I > 11 THEN 4040
4020 PRINT 11 - I
4025 GOSUB 4500
4030 LET I=I+1
4035 GOTO 4015
4040 PRINT "You have left the spacecraft."
4050 PRINT "Try to land with velocity less than 5 m/sec."
4060 RETURN
4500 REM Delay
4510 LET J = 1
4515 IF J > 500 THEN 4530
4520 LET J = J+1
4525 GOTO 4515
4530 RETURN
5000 PRINT "Do you want to play again? (0 = no, 1 = yes)"
5010 INPUT Y
5020 IF Y == 0 THEN 5040
5030 RETURN
5040 PRINT "Have a nice day."
5050 END
5. Замощение фигуры (3-4 курс)
Найти способ замощения фигуры L-образными элементами вида:
#
#
##
Во входном файле в первой строке задается количество
строк и столбцов для формы, определяющей фигуру, далее идет
форма. Пустые клетки обозначаются символом '.', клетки фигуры – '#'. В выходном файле должно выводиться разбиение заданной
фигуры на L-образные элементы. Разные L-элементы обозначаются
разными прописными буквами латинского алфавита. Число клеток в фигуре не будет превышать 100.
Если разбиение невозможно, вывести только слово "НЕВОЗМОЖНО".
Пример ввода
5 10
...#......
..####....
######....
..####.#..
..#..###..
Пример вывода
...E......
..DEBB....
DDDEEB....
..CCCB.A..
..C..AAA..
6. Слово без повторений (3-4 курс)
Построить из трех заданных букв слово длины `N`, так чтобы
никакие два стоящих подряд подслова не совпадали.
Во входном файле в первой строке идет длина слова
`N` (`N\ ≤\ 1000`), во второй строке – три буквы, из которых надо построить слово.
Если построение такого слова невозможно, в выходной файл вывести сообщение "НЕВОЗМОЖНО".
7. Вывод дерева (3-4 курс)
Во входном файле задан список каталогов (до 100 строк).
В выходной файл вывести дерево каталогов (см. пример).
Пример ввода
\TOOLS
\TOOLS\ARC
\WORK\PS-101
\TOOLS\DRIVERS
\TOOLS\DRIVERS\VESA
\WORK\PS-101\MOE
Пример вывода
\
+-TOOLS
| +-ARC
| +-DRIVERS
| +-VESA
+-WORK
+-PS-101
+-MOE
8. Генерация множества (3-4 курс)
Напишите программу для генерации первых `N` (`N\ ≤\ 1000`) попарно различных чисел множества `M`, которое определяется следующим образом:
а) число 1 принадлежит `M`
б) если `x` принадлежит `M`, то `y=2*x+1` и `z=3*x+1` также принадлежат `M`
в) никакие другие числа не принадлежат `M`.
Выводимые элементы множества `M` должны быть упорядочены по
возрастанию.
Пример вывода
1 3 4 7 9 10 13