Задачи - УПП, Седмица 8, 20.11.2025
GitHub Classroom: https://classroom.github.com/a/rhpKbNmH
За решаване
Задача 1
От входа получавате матрица 5 на 5 от цели числа. Трябва да върнете дали е разредена матрица: дали има повече нули отколкото други числа.
| Вход | Изход |
|---|---|
|
|
|
|
Задача 2
Напишете функция, която получава матрица с произволен размер и масив, чиято дължина е същата като на един ред в матрицата.
Намерете сумата на всички редове и я запазете в подадения масив.
От входа получавате матрица 7 на 3 от цели неотрицателни числа. Използвайки вашата функция, намерете сумата на всички редове и я изкарайте.
| Вход | Изход |
|---|---|
|
|
|
|
Задача 3
Напишете функция, която получава две матрици с произволни размери, съствени от реални числа. Може да допуснете, че размера на втората матрица е по-малък от тази на първата.
Трябва да запишете във втората матрица, всички елементи от "горния ляв квадрат" на първата матрица. Тоест, всички елементи от горния ляв ъгъл, надолу и надясно колкото е размера на втората матрица.
От входа получавате матрица 6 на 6 от реални числа.
След това получавате 4 реални числа: първите две са координат в матрицата (където горния ляв ъгъл е (0, 0)), вторите две са нейни размери.
Използвайки вашата функция, трябва да изкарате подматрицата с начало подадения координат и размери подадените размери използвайки вашата функция.
| Вход | Изход |
|---|---|
|
|
|
|
|
|
|
|
Задача 4
City Bloxx е известна мобилна игра за строене на сгради. В нейния "Build city" режим, целта е построените сгради да се подредят в матрица 5 на 5.
Нека да разгледаме следните правила за сгради (в самата игра има някои разлики):
- Жилищните сгради може да се поставят навсякъде.
- Търговските сгради трябва да бъдат поставени до поне една жилищна сграда.
- Офис сградите трябва да бъдат поставени до поне една жилищна и една търговска.
- Луксозните сгради трябва да бъдат поставени до поне една жилищна, една търговска и една офис сграда.
Сгради са съседни само по вертикал и хоризонтал, не по диагонал.
От входа получавате масив 5 на 5 с цели числа, където с 1 до 4 се обозначават сградите, от жилищни до луксозни. Изкарайте дали подредбата на сградите е позволена (следва горните правила).
| Вход | Изход |
|---|---|
| Valid |
| Invalid |
| Invalid |
| Invalid |
| Valid |
Задача 5
От входа получавате матрица 3 на 3, съствена от цели числа. Трябва да я транспонирате: да смените елементите над и под главния диагонал, и да изкарате резултата.
| Вход | Изход |
|---|---|
|
|
|
|
Задача 6
Напишете функция, която приема матрица с произволни размери, съствена от реални числа, заедно с два индекса. Разменете колоните на подадените индекси, ако това е възможно.
От входа получавате матрица 3 на 5, съствена от реални числа. След това получавате два индекса на колони.
Трябва да размените двете колони, използвайки вашата функция, и да изкарате резултата.
Вашия изход не е нужно да бъде подравнен.
| Вход | Изход |
|---|---|
|
|
|
|
|
|
Задача 7
От входа получавате матрица от букви 3 на 3.
Тя определя шаблон, където буквата * означава, че всяка стойност е позволена.
След това от входа получавате матрица 6 на 6, съствена от букви. Трябва да намерите всички срещания на шаблона в тази матрица, като срещанията може да се застъпват!
| Вход | Изход |
|---|---|
| 4 |
| 8 |
| 4 |
| 16 |
Задача 8
От входа получавате две матрици 3 на 3, съствени от цели неотрицателни числа. Пресметнете умножението на матриците (ред по стълб) и изкарайте резултата.
| Вход | Изход |
|---|---|
|
|
|
|
Задача 9
При изграждането на устройства като клавиатури, често се използва "бутонна матрица". Няма да навлизаме в електрониката, но идеята е че когато натиснеш бутон, съответната колона и ред са "свързани"/активни.
Тоест, когато активни ред и колона се пресичат, тогава съответния бутон е натиснат.
Това означава, че се нуждаем да погледнем само състоянията на всеки ред и колона, и ще знаем всички натиснати бутони (вместо да поглеждаме всеки бутон поотделно).
Нека да разглеждаме стандартна 4 на 3 телефонна клавиатура[1]:
От входа първо получавате 4 булеви стойности: дали реда е активен (отгоре надолу). След това получавате още 3 булеви стойности: дали колоната е активна (отляво надясно).
Изкарайте кои бутони са натиснати, използвайки цифровите знаци, звезда (*) и диез (#).
Ако няма натиснати, изкарайте съответно съобщение.
| Вход | Изход |
|---|---|
| 0 1 0 0 0 0 1 | 6 |
| 0 0 0 1 1 0 1 | * # |
| 1 0 0 1 1 0 1 | 1 3 * # |
| 0 1 0 1 0 1 0 | 5 0 |
| 1 1 1 1 1 1 1 | 1 2 3 4 5 6 7 8 9 * 0 # |
| 0 0 0 0 0 0 0 | Nothing pressed |
Задача 10
Триъгълника на Паскал е изчисление, при което се конструира триъгълник от числа. По двете "рамене" има единици, и всяко вътрешно число е сумата на горните две.
Пояснителна анимация[2]:
Генерирайте и изкарайте триъгълника на паскал в матрица 11 на 11, където двете страни на триъгълника са първата колона и главния диагонал.
Нека стойностите извън триъгълника да са нули.
Изход: (не е нужно да бъде подравнен)
1 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0
1 2 1 0 0 0 0 0 0 0 0
1 3 3 1 0 0 0 0 0 0 0
1 4 6 4 1 0 0 0 0 0 0
1 5 10 10 5 1 0 0 0 0 0
1 6 15 20 15 6 1 0 0 0 0
1 7 21 35 35 21 7 1 0 0 0
1 8 28 56 70 56 28 8 1 0 0
1 9 36 84 126 126 84 36 9 1 0
1 10 45 120 210 252 210 120 45 10 1
Задача 11
От входа получавате матрица 10 на 10 от цели неотрицателни числа. След това получавате размер между 0 и 10.
Трябва да имплементирате "размазване", където всяка нова стойност на една клетка е равна на средната стойност на всички съседни клетки в "радиус" от подадения размер.
Тоест, ако размера е 2, тогава се взема средно аритметично на всяка клетка, която е на максимум две позиции разтояние, вертикално, хоризонтално и диагонално.
Ако размера е 0, тогава всяка клетка е средно аритметично на "себе си", т.е. не се променя. Не добавяйте към средното аритметично несъществуващи клетки (напр. клетката в горния ляв ъгъл няма клетки над или в ляво от себе си).
(Вашия изход не е нужно да бъде подравнен.)
| Вход | Изход |
|---|---|
|
|
Задача 12
От входа получавате два реални координата, между (0,0) и (10,10).
Трябва да върнете матрица 10 на 10 от знаци, която се съставя единствено от шпации (spaces) и хиксове (x).
Зачитаме, че координатите директно съответстват на матрицата, като (0,0) се намира в горния ляв ъгъл и (10,10) в долния десен.
В тази матрица, по подразбиране стоят само шпации. Хиксовете се намират там, където начертаната отсечка между входните точки би застъпила матрицата. Примерна диаграма:
Тази операция се нарича интерполация.
| Вход | Изход |
|---|---|
| 1 8.5 8.5 2.5 |
|
За самоподготовка
Задача 13
От входа получавате матрица 8 на 8, съставена от символите точка и плюс. Трябва да върнете височината и ширината на най-големия правоъгълник, който застъпва всички плюсове.
| Вход | Изход |
|---|---|
| 5 6 |
| 0 0 |
| 8 8 |
Задача 14
От входа приемате масив от 6 елемента и матрица с 6 реда и 3 колони, всички съставени от реални числа. Трябва да реализирате умножение на вектор по матрица (където масива е вектора).
| Вход | Изход |
|---|---|
| 91 217 343 |
| 8 7 41.8 |
Задача 15
От входа получавате матрица 9 на 7 с реални числа. След това получавате още едно реално число: максимална разлика.
Проверете дали данните са гладки: стойността във всяка една клетка да се различава с най-много максималната разлика от всички свои съседни клетки (по хоризонтала, вертикала и диагонала).
| Вход | Изход |
|---|---|
| Smooth |
| Smooth |
| Not smooth |
| Not smooth |
Задача 16
Напишете функция която приема матрица с произволни размери и "връща" матрица, която е като входната матрица, но всички елементи са "завъртяни" на дясно с 90 градуса.
Тоест, горния ляв елемент става горния десен, горния десен става долния десен и так. нат.
Не забравяйте да проверите дали можете да попълните завъртяната матрица в тазия която "връщате". Ако не можете, не записвайте нищо във върнатата.
От входа получавате матрица 4 на 8, съставена от цели числа. Използвайки вашата функция, завъртете матрицата и изкарайте резултата.
| Вход | Изход |
|---|---|
|
|
Задача 17
Трябва да реализирате (опростен вариант на) "pixel binning": спрямо подаден коефициент, стойностите в клетки се смесват.
Тоест, ако имаме binning от 2, тогава ще пресметнем средната стойност за всеки квадрат 2 на 2 и ще заменим всяка стойност от квадрата със средната.
От входа получавате матрица 12 на 12 с цели неотрицателни числа и неотрицателен binning коефициент. Трябва да върнете матрицата след приложен binning.
| Вход | Изход |
|---|---|
|
|
Задача 18
От входа получавате матрица 10 на 10 с цели неотрицателни числа. Трябва да върнете най-голямата подматрица, съставена само от единици.
Сравнявайте матриците по техния размер, тоест броя елементи. Ако има няколко еднакво големи подматрици, може да изкарате която и да е от тях.
| Вход | Изход |
|---|---|
|
|
Задача 19
От входа получавате матрица 8 на 8 от реални числа. Реализирайте нещо, което ще наречем "сгъване" на матрицата, докато не остане само едно число.
Дефинираме сгъването така:
- сумираме горната половина на матрицата в долната половина, след това
- в долната половина, сумираме дясната половина в лявата (дясната една четвърт в лявата), след това
- в долната лява една четвърт, сумираме долната половина в горната,
- и така нататък
Накрая изкарате резултатното число.
| Вход | Изход |
|---|---|
| 315 |
Задача 20
Генерирайте и изкарайте триъгълника на Бел в долния ляв ъгъл на матрица 11 на 11. Това означава, че страните на триъгълника включват първата колона и главния диагонал.
- Започва се с единица.
- На всеки следващ ред, първия елемент е последния (ненулев) елемент на предходния ред.
- Всеки следващ елемент е сумата на предходния елемент в текущия ред и предходния елемент в горния ред.
- Спираме да сумираме, докато един от предходните ни елементи не бъде 0 (т.е. ако ще сумираме нещо с 0).
Пояснителна анимация[3]:
Тази задача е подобна на Задача 10.
Изход: (не е нужно да бъде подравнен)
1 0 0 0 0 0 0 0 0 0 0
1 2 0 0 0 0 0 0 0 0 0
2 3 5 0 0 0 0 0 0 0 0
5 7 10 15 0 0 0 0 0 0 0
15 20 27 37 52 0 0 0 0 0 0
52 67 87 114 151 203 0 0 0 0 0
203 255 322 409 523 674 877 0 0 0 0
877 1080 1335 1657 2066 2589 3263 4140 0 0 0
4140 5017 6097 7432 9089 11155 13744 17007 21147 0 0
21147 25287 30304 36401 43833 52922 64077 77821 94828 115975 0
115975 137122 162409 192713 229114 272947 325869 389946 467767 562595 678570
Задача 21
От входа получавате матрица 3 на 4 от реални числа и след това височина и дължина на изходната матрица.
Трябва да "реоразмерите" матрицата, като запазите последователността на елементи отляво надясно, отгоре надолу. Височината и дължаната няма да са повече от 10.
Ако изходната матрица е по-голяма, попълнете празните позиции с нули.
| Вход | Изход |
|---|---|
|
|
|
|
Задача 22
От входа получавате матрица 3 на 3 със знаци. След това получавате число "режим", което е 1, 2 или 3.
Трябва да изкарате матрица със знаци 9 на 9, в която е попълнено изображението спрямо режима.
- Режим 1 обозначава повтаряне, където изображението се повтаря последователно
- Режим 2 обозначава "border", където изображението се слага в центъра и останалта част се попълва със знак диес
#. - Режим 3 обозначава "clamp", изображението се слага в центъра и останалата част се попълва като се повтаря последната буква. Тоест, дясното 3 на 3 се попълва с повторение на десния знак.
| Вход | Изход |
|---|---|
|
|
|
|
|
|
Задача 23
От входа получавате цяло неотрицателно число, по-малко от 50. Трябва да изкарате спирала от това число към нула (включително), която се движи от началното число до нула обратно на часовниковата стрелка, като 1цата е в дясно от нулата.
Зачитайте, че 0 винаги е в центъра на спиралата и се въртите първо с една позиция разстояние, после с две и так. нат.
(Вашия изход не е нужно да бъде подравнен.)
| Вход | Изход |
|---|---|
| 4 |
|
| 5 |
|
| 10 |
|
| 15 |
|
За любознателни
Задача 24
Реализирайте матричен калкулатор. От входа получавате матрица 4 на 4 с реални числа и след това получавате редица операции.
Всяка операция започва с буква, като буквата $ сигнализира край на програмата.
След всеки знак има няколко аргумента, т.е. допълнителни стойности които трябва да се въведат, преди операцията да се изпълни.
- Операцията
*обозначава умножение на ред, и след знака има цяло неотрицателно число за индекс на ред и след него е реално число (коефициент с който да умножим реда). - Операцията
+обозначава сума на редове, след знака се очакват два неотрицателни индекса на редове, първия ред се сумира в втория - Операцията
^обозначава размяна на редове, след знака се очакват два неотрицателни индекса на редове и стойностите им се разменят.
След всяка операция (освен $) трябва да изкарате състоянието на матрицата.
Задача 25
Трябва да реализирате Играта "Живот".
От входа получавате матрица 10 на 10 с булеви стойности. След това получавате неотрицателно число: брой генерации (ходове).
Всяка клетка наричаме жива или мъртва (съответно на true или false).
В една генерация (ход) на играта, всяка клетка променя своя статус (стойност) по следните правила:
- всяка жива клетка с по-малко от два живи съседа (вертикално, хоризонтално и диагонално) умира
- всяка жива клетка с два или три живи съседа остава жива
- всяка жива клетка с повече от три живи съседа умира
- всяка мъртва клетка с точно три живи съседа оживява
| [1] | Изображение от Sakurambo - създадено чрез Adobe Illustrator CS2, Публичен домейн, https://commons.wikimedia.org/w/index.php?curid=2048341 ^ |
|---|---|
| [2] | Анимация от Hersfold - собствен труд, Публичен домейн, https://commons.wikimedia.org/w/index.php?curid=3902538 ^ |
| [3] | Анимация от Xanthoxyl - собствен труд, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=5832904 ^ |
Да се има впредвид, че спрямо използваната прецизност, някои стойности може да са шпации, когато трябва да са хиксове.
Сравнявайте дали повечето стойности са коректни.