Încercați-vă puterile

PROBLEME propuse pentru rezolvare

Probleme, probleme... Unele preluate de la concursuri ACM, (prin bunăvoința studentului Valer Crișan) și împreună cu altele, propuse membrilor lotului național de informatică cu ocazia taberei de antrenament de la Liceul de Informatică din Cluj.

P039801: În fabrica de mobilă

Într-o fabrică se confecționează din plăci dreptunghiulare, piese de mobilier, de asemenea dreptunghiulare, de diferite dimensiuni.

Mașina care decupează aceste piese impune următoarele restricții:

- o tăietură realizată într-o placă trebuie să o separe pe aceasta în două plăci (trebuie să treacă dintr-o parte în alta, drept, fără a roti cuțitul);

- prin tăiere se pierde din placă o bucată de dimensiune D.

Despre fiecare piesă solicitată se știe dacă se pot roti (sau nu) cu 90° în scopul confecționării din placa existentă. Rotirea necesită repoziționări ale cuțitului mașinii.

Să se determine modalitatea de dispunere a pieselor solicitate pe plăcile existente, astfel încât materialul pierdut cât și numărul de repoziționări ale cuțitului să fie minime.

Date de intrare:

Pe prima linie a fișierului de intrare PLACI.IN sunt date dimensiunile plăcilor existente (lățime și lungime, numere naturale <=1 și <=1000), numărul lor fiind infinit și toate plăcile fiind de aceeași dimensiune.

Pe linia a doua este scrisă valoarea lui D (număr natural, 1<=D<=5).

Pe următoarele linii sunt scrise date referitoare la tipurile de piese solicitate, despărțite printr-un spațiu:

nr latime lungime caracter

unde:

- nr este un număr natural care reprezintă numărul de piese solicitate de același tip (1<=nr<=200);

- latime și lungime precizează dimensiunile piesei solicitate (numere naturale, 1<=latime,lungime<=1000);

- caracter este fie 'r' fie 'n'; prin ele se precizează dacă o piesă poate fi (sau nu) rotită cu 90° la aranjarea pe placă.

Date de ieșire:

Rezultatele se vor scrie în fișierul de ieșire PLACI.OUT astfel:

pierdere // reprezintă suprafața totală a materialului pierdut din plăcile folosite (total D și material din care nu se poate confecționa nici o piesă solicitată);

nr_rotiri // numărul de repoziționări ale cuțitului;

placa x // cuvântul 'placa', un spațiu, apoi x = numărul de ordine al plăcii;

piesa st sus caracter // unde piesa este numărul de ordine al piesei, st și sus sunt coordonatele poziției piesei pe placă (originea =0,0 se consideră a fi în colțul din stânga sus al plăcii);

// caracter este 'r' sau 'n' în funcție de posibilitățile de rotire.

P039802: Cămile

O caravană cu n (n<=30) cămile înaintează în deșert în șir indian. După prima zi de mers apare un conflict între fiecare cămilă și cea din fața sa (între a doua și prima, între a treia și a doua etc).

Conducătorul caravanei va trebui ca a doua zi, datorită conflictelor, să schimbe ordinea cămilelor în caravană. Să se găsească numărul de posibilități pe care le are conducătorul caravanei.

Date de intrare:

Din fișierul CAMILE.IN se va citi numărul natural n al cămilelor.

Date de ieșire:

Rezultatul se va scrie în fișierul CAMILE.OUT.

Exemplu:

CAMILE.IN CAMILE.OUT

3 3

P039803: HDTV (High Definition TeleVision)

La televiziunea HDTV se utilizează mai multe modalități de comprimare a imaginilor în scopul eliminării informațiilor redundante, astfel reducând cantitatea de informații care urmează să fie transmisă. Să se simuleze decomprimarea în scopul reconstruirii imaginilor de televiziune. Pentru simplificare, imaginile sunt reprezentate prin tablouri dreptunghiulare de pixeli având originea (0,0) în colțul din stânga jos. Fiecare pixel poate avea ca valoare una din cele 26 de litere ale alfabetului englez de la 'A' la 'Z'.

Date de intrare:

Sistemul de comenzi preia o literă mică urmată de lista parametrilor care reprezintă comanda. Anumiți parametri definesc blocuri dreptunghiulare din imagine. În listele de comenzi de mai jos, blocul (x,y,w,h) reprezintă un bloc dreptunghiular având colțul din stânga jos în punctul de coordonate (x,y) și colțul din dreapta sus în punctul de coordonate (x+w-1,y+h-1). Aceste comenzi și parametrii lor sunt:

i x y

Efect:

Se inițializează o imagine nouă având lățimea de x pixeli și înălțimea de y pixeli. Imaginea conține cel mult 10000 pixeli care sunt inițializați cu litera 'A'. Ultima comandă în fișierul de intrare este o comandă similară care indică o imagine având dimensiunea 0.

f x y w h c

Efect:

Se umple blocul (x,y,w,h) cu caracterul c, unde c este o majusculă.

c x y w h a b

Efect:

Se copiază un bloc (x,y,w,h) în blocul (a,b,w,h). Aceste blocuri se pot suprapune.

r x y w h data

Efect:

Se citesc valorile elementelor cu care se va încărca blocul (x,y,w,h) din lista de date data. Blocul este umplut linie după linie începând cu pixelul (x,y). Datele sunt wŽh majuscule.

d x y w h data

Efect:

Se decomprimă datele dintr-un bloc (x,y,w,h) în mod similar comenzii r. Datele sunt memorate într-un format codificat, alcătuit din perechi de număr-literă, unde număr precizează numărul de apariții al literei literă.

Exemplu:

3A1B10C corespunde șirului decomprimat AAABCCCCCCCCCC.

Observații:

- Comenzile și parametrii lor pot conține spații și tabulatoare și pot fi continuate pe mai multe linii.

- Un număr nu va fi rupt în cifre niciodată.

- Parametrii sunt numere pozitive și sunt de așa natură încât orice bloc specificat se află în interiorul imaginii.

- În cazul comenzilor r și d, conținutul parametrului data respectă dimensiunile blocului.

Din fișierul de intrare TV.IN se va citi o listă de comenzi.

Date de ieșire:

De fiecare dată când se întâlnește o comandă i, unitatea de control va calcula un număr de verificare pentru imaginea existentă, apoi se va inițializa o imagine nouă. Numărul de verificare este suma modulo 256 a codurilor ASCII ale caracterelor corespunzătoare pixelilor din imagine, luate linie după linie în forma:

nr_de_verificare = 127

cu un singur spațiu în fața și după semnul '='.

Nici un număr de verificare nu se va calcula și scrie pentru prima comandă i, deoarece nu există nici o imagine în acest moment.

Următoarele diagrame prezintă forma imaginilor corespunzătoare conținutului fișierelor TV.IN și TV.OUT.

AAAAUGHAAA LOVE

BBBBLEAAAA LONE

BBBBLLLAAA LATE

AA AAAABLLAAA HATE

Exemplu:

TV.IN

i2 1i 10 4f 0 1 6 2 Bd4 0 3

4 1B6L1E1A

1U1G1H i 4 5 r 0 4 4 1 L OVE c 0 4 4

1 0 3 f 2 3 1 1 N

c 0 3 4 1 0 2 f 1 2 1 1 A c 0 2 4

1 0 1 r 2 1 1 1 T

c 0 1 4 1 0 0 f 0 0 1 1 Hi 0 0

TV.OUT

nr_de_verificare = 130

nr_de_verificare = 152

nr_de_verificare = 204

P039804: Inteligență artificială simbolică

Trebuie să scrii un program simplu de inteligență artificială simbolică. Acestuia i se vor furniza anumite informații și i se vor pune întrebări. Programul de inteligență artificială trebuie să răspundă la întrebări. Din fericire aceste informații și întrebări se referă numai la anumiți indivizi care sunt grupați (pentru grupare se folosesc substantive colective) care efectuează acțiuni (pentru gruparea acțiunilor se folosesc verbe).

Gramatica folosită este foarte simplă: se folosesc două tipuri de propoziții și un singur tip de întrebare. Toate substantivele la plural sunt marcate printr-un caracter 's'.

Date de intrare:

Fiecare șir din datele de intrare conține fie o singură propoziție, fie un spațiu. Sfârșitul fișierului este marcat de o linie a cărui conținut este caracterul '#'. Fiecare propoziție are una din următoarele forme:

- 'as v bs.', unde a și b sunt substantive și v este un verb. Aceasta înseamnă că tot ce este de tip a realizează acțiunea v asupra a tot ce este de tip b.

- 'a is a b.', unde a și b sunt substantive. Aceasta înseamnă că individul a este de tip b.

- întrebarea are forma: 'does a v b?', unde a și b sunt substantive, iar v este verb. Se pune întrebarea: individul a face acțiunea v asupra individului b?

Lungimea maximă a șirurilor este de 80 litere. Cuvintele conțin cel mult 40 de litere și pot fi formate din majuscule și litere mici, deși în timpul căutării litera mică nu se deosebește de majusculă. Pot exista mai multe spații între cuvinte, dar niciodată între cuvinte și semnele de punctuație de la sfârșitul propozițiilor. Numărul maxim de informații dintr-un fișier de intrare este 100.

Date de ieșire:

Pentru fiecare întrebare din fișierul de intrare se va afișa o singură linie, având conținutul: 'YES.' în cazul în care din informațiile anterioare se poate decide că răspunsul la întrebare este adevărat și 'NO.' în caz contrar.

Exemplu:

AI.IN AI.OUT

Dogs chase cats. YES.

Sheeps ignore glasss. NO.

Fido is a dog.

Fluffles is a cat.

Does Fido chase Fluffles?

Does Fluffles chase Fido?

P039805: Potrivire de cuvinte

Ca agent al serviciilor secrete, ai sub supraveghere traficul corespondenței pe poșta electronică, căutând coduri care ar putea să indice acțiuni subversive. Totuși, anumite elemente subversive ale societății au început să amestece literele din unele cuvinte din mesajele lor cu scopul de a le face de neînțeles. Tu, familiarizat cu asemenea trucuri, te decizi să scrii un program care să caute propoziții având cuvinte ale căror litere au fost amestecate.

Date de intrare:

Datele de intrare din fișierul AI.IN conțin perechi formate din liste de cuvinte și propoziții. Lista de cuvinte conține cuvintele care trebuie căutate în propoziția următoare. Toate literele din datele de intrare sunt litere mici. Cuvintele pot fi formate din cel mult 20 de litere și sunt separate printr-un spațiu. Lungimea maximă a fiecărei linii este de 80 de caractere. Fiecare listă este scrisă pe o singură linie și conține cel mult 20 de cuvinte. Propozițiile se pot continua pe mai multe linii și se termină cu caracterul '.'.

Fișierul se termină cu o listă care conține caracterul '#'.

Date de ieșire:

Pentru fiecare pereche de listă de cuvinte și propoziție, să se găsească cuvintele din listă care apar în propoziții (având caracterele amestecate sau nu). În fișiereul AI.OUT se vor afișa aceste cuvinte în ordinea în care apar în listă, separate printr-un spațiu. Dacă nici un cuvânt din listă nu se potrivește cu vreun cuvânt din propoziție, se va afișa o linie vidă.

Exemplu:

CUVINTE.IN

bomb

we twan ot ombb mericaa.

guns mines missiles

aameric ssell snug

dan iimsssle ot sit neeemis.

cat sat mat

cat sat tam mat.

#

CUVINTE.OUT

bomb

guns missiles

cat sat mat

P039806: Sfârșitul lumii

Unui profet i s-a spus că sfârșitul lumii poate fi cândva între 01994 și 99999 inclusiv. I s-au dat diferite indicații privind data posibilă, prezentate sub forma:

"Cifra zecilor este de trei ori mai mare decât cifra sutelor, plus șase".

Profetul a interpretat această indicație sub forma: 'd=3c+6;'

(e este cifra zecilor de mii, d este cifra miilor, c este cifra sutelor, b este cifra zecilor, a este cifra unităților numărului care reprezintă un an).

Să se scrie un program care citește un set de indicații care pot avea una din formele:

<v> = propoziție +/- propoziție, sau

<v> = propoziție.

unde:

propoziție poate fi:

k<v> sau

<v> sau

k

unde:

<v> este o variabilă (a, b, c, d, sau e);

k este o constantă având valoarea între 0 și 9.

Date de intrare:

Fiecare linie din fișierul de intrare LUMEA.IN conține un set de indicații diferite. Sunt cel mult 5 indicații în fiecare set. Să se afîșeze, pentru fiecare set, prima dată după 1993 care poate fi un an care să reprezinte sfârșitul lumii (nu contrazice nici una din indicații), sau mesajul 'Suntem salvati!', dacă rezultă că nici o dată până la 100000 nu ar fi data probabilă a sfârșitului lumii (de asemenea, această concluzie nu contrazice nici una din indicațiile setului).

Toate calculele sunt realizate modulo 10. Fișierul de intrare se termină printr-o linie care conține caracterul '#'.

Exemplu:

LUMEA.IN

a=2;b=4;e=9+a;

d=3;

c=e+e;d=4;c=d+e;

e=e+1;

c=2d+4;e=4-2c;a=4d+5;d=3;b=a-e;

#

LUMEA.OUT

10042

03000

44800

Suntem salvati!

43037

P039807: Prelucrare de texte

Să se scrie un procesor de texte care va prelucra șiruri de caractere (string-uri). Va citi o singură linie a textului, urmată de o linie de comenzi care va modifica șirul. Programul trebuie să producă la ieșire o linie a textului prelucrat.

Comenzile sunt următoarele:

0 - mută cursorul la începutul liniei;

$ - mută cursorul în poziția următoare ultimului caracter (în dreptul caracterului de sfârșit de linie);

x - șterge caracterul din dreptul cursorului dacă nu este la sfârșitul liniei;

s - înlocuiește caracterul din dreptul cursorului cu caracterul din dreapta acestuia, cât timp cursorul nu este în fața caracterului sfârșit de linie sau în dreptul acestuia;

i x - inserează caracterul x pe poziția cursorului, și mută cursorul cu un caracter;

u - schimbă litera mică în majusculă și mută cursorul cu un caracter;

+ - mută cursorul cu un caracter la dreapta;

- - mută cursorul cu un caracter la stânga.

Cursorul poate fi poziționat în dreptul primului caracter, sau în dreptul oricăruia din fața caracterului de sfârșit de linie.

Comenzile din fișierul de intrare TEXTE.IN sunt scrise pe o linie, după care, pe o linie nouă urmează textul care nu conține spații. Linia în care s-a scris textul nu conține (în interiorul textului) caracterul de sfârșit de linie. Cursorul pornește de la primul caracter al fiecărui text. Fișierul se termină cu o linie text care conține un singur caracter: '#'.

Exemplu:

TEXTE.IN

Hello, I am a frog.

$-----xxxxipieirisioin

Needle nardle noo.

+++xizuu+++xxips

#

TEXTE.OUT

Hello, I am a person.

NeezLE napel noo.

P039808: Trupa de comando

Se consideră o hartă pe care sunt desenate n țări. Suprafața fiecărei țări este colorată într-o singură culoare.

O trupă de comando pornește dintr-o țară dată x și trebuie să ajungă într-o altă țară dată y. Pe parcursul traversării oricărei țări, membrii trupei trebuie să se îmbrace în echipament de camuflaj având culoarea de pe hartă a țării traversate. Determinați drumul trupei de comando astfel încât ei să aibe nevoie de un număr minim de echipamente.

Date de intrare:

Fișierul de intrare INPUT.TXT are următoarea structură:

- pe prima linie se află un număr întreg n (2<=n<=100), reprezentând numărul de țări de pe hartă;

- fiecare dintre următoarele n linii conține un string care are structura:

numei culoarei vecin1 vecin2 ... vecink

unde:

- numei reprezintă numele unei țări (string);

- culoarei reprezintă culoarea (string) atașată țării având numele numei;

- vecin1 vecin2 ... vecink (0<=k<=n) reprezintă numele țărilor vecine cu țara numei;

- șirurile de caractere corespunzătoare numelor, respectiv culorii sunt separate prin câte un spațiu;

- pe următoarea linie sunt date două nume (stringuri): țara din care pornește expediția și țara în care trebuie să ajungă.

Se presupune că datele sunt corecte.

Date de ieșire:

Fișierul de ieșire OUTPUT.TXT are următoarea structură:

- pe prima linie se va scrie un număr întreg m (1<=m<=n) reprezentând numărul de echipamente necesare trupei pentru a realiza expediția respectând cerințele problemei;

- pe următoarele m linii se va descrie drumul trupei, specificând pe fiecare linie numele unei țări prin care va trece trupa.

În cazul în care există mai multe soluții, se va specifica cea care trece printr-un număr minim de țări.

Exemplu:

INPUT.TXT:

6

Romania rosu Bulgaria Ungaria Yugoslavia

Bulgaria verde Romania Yugoslavia

Ungaria galben Romania Yugoslavia Croatia

Yugoslavia alb Romania Ungaria Croatia

Croatia rosu Ungaria Yugoslavia Italia

Italia galben Croatia

Romania Italia

OUPUT.TXT:

2

Romania

Ungaria

Croatia

Italia

[cuprins]