diff --git a/src/task-3/README.md b/src/task-3/README.md index 55b48e08bbdb3319f8f9aadd1dc4175ff23e806f..8f4c9679bad3866dfa02f701d12f270db0c164fb 100644 --- a/src/task-3/README.md +++ b/src/task-3/README.md @@ -1,12 +1,10 @@ -# Task 2 - Depth first search +## Task 3 - Depth first search -Ăn acest task veČi implementa un algoritm cunoscut de la SDA de cautare pe grafuri, depth first search. +Pentru ca Zoly sÄ verifice cÄ drumul pe care e transmis un pachet este legitim, se va realiza o cautare in topologia reČelei. Protocolul de comunicaČie garanteazÄ trimiterea pachetelor folosind algoritmul de cÄutare ĂŽn adâncime. Astfel, Čtiind sursa pachetului, putem gÄsi calea legitimÄ cÄtre toate celelalte gazde din reČea. -*Note:* implementarea trebuie sÄ fie recursivÄ, NU iterativÄ. +Ăn acest task veČi implementa algoritmul cunoscut de la SDA de cautare pe grafuri, depth first search. -Pentru acest task aveČi de implementat funcČia `dfs()` ĂŽn fiČierul `dfs.asm`. - -## Algoritmul dfs +### Algoritmul dfs Precum sunteČi deja familiari, depth first search implicÄ cautare ĂŽn adâncime pe grafuri, pornind de la un nod sursÄ dat. Algoritmul marcheazÄ nodul iniČial ca fiind visitat Či se aplicÄ recursiv pe toČi vecini lui. Algoritmul va continua, evitând nodurile marcate ca vizitate. @@ -16,18 +14,18 @@ LuÄm graful urmÄtor ca exemplu: DacÄ nodul sursÄ este 1, atunci o posibilÄ cautare dfs ar fi urmatoarea: -* Nodul 1 este vizitat. -* Nodul 2 este vizitat. -* Nodul 2 nu are vecini, ne ĂŽntoarcem la nodul 1. -* Nodul 3 este vizitat. -* Nodul 2 a fost deja vizitat, vizitam nodul 4. -* Nodul 3 a fost deja vizitat, iar nodul 4 nu mai are vecini, deci ne ĂŽntoarcem la nodul 3. -* Nodul 3 nu mai are vecini, ne ĂŽntoarcem la nodul 1. -* Nodul 1 nu mai are vecini, se ĂŽncheie cÄutarea. +- Nodul 1 este vizitat. +- Nodul 2 este vizitat. +- Nodul 2 nu are vecini, ne ĂŽntoarcem la nodul 1. +- Nodul 3 este vizitat. +- Nodul 2 a fost deja vizitat, vizitam nodul 4. +- Nodul 3 a fost deja vizitat, iar nodul 4 nu mai are vecini, deci ne ĂŽntoarcem la nodul 3. +- Nodul 3 nu mai are vecini, ne ĂŽntoarcem la nodul 1. +- Nodul 1 nu mai are vecini, se ĂŽncheie cÄutarea. -Dfs-ul poate avea mai multe cÄutari valide, ĂŽn funcČie de ordinea ĂŽn care alegem sÄ vizitÄm vecinii. Ăn cazul nostru, Celelalte posibilitÄČi de cÄutare ar fi {1, 3, 2, 4} Či {1, 3, 4, 2}. +Dfs-ul poate avea mai multe cÄutari valide, ĂŽn funcČie de ordinea ĂŽn care alegem sÄ vizitÄm vecinii. Ăn cazul nostru, celelalte posibilitÄČi de cÄutare ar fi {1, 3, 2, 4} Či {1, 3, 4, 2}. -## API +### API Ăn cadrul task-ului, nodurile sunt reprezentate sub forma unui id de tip `uint32_t` (unsigned int). Pentru a obČine vecinii unui nod, se apeleazÄ funcČia `expand` cu urmÄtoarea semnÄturÄ: @@ -41,13 +39,13 @@ Aceasta returneazÄ **adresa** unei structuri care conČine vecinii nodului ĂŽn ```x86asm struc neighbours_t .num_neighs resd 1 ; NumÄrul de vecini. - .neighs resd 1 ; Vectorul cu `num_neighs` vecini. + .neighs resd 1 ; Adresa vectorul cu `num_neighs` vecini. endstruc ``` -## CerinČa +### CerinČa -Vi se cere sÄ implementaČi funcČia `dfs()` din fiČierul `dfs.asm`, care are urmÄtoarea semnÄturÄ: +Vi se cere sÄ implementaČi **recursiv** funcČia `dfs()` din fiČierul `dfs.asm`, care are urmÄtoarea semnÄturÄ: ```c void dfs(uint32_t node, neighbours_t *(*expand)(uint32_t node)); @@ -55,4 +53,11 @@ void dfs(uint32_t node, neighbours_t *(*expand)(uint32_t node)); Aceasta primeČte ca parametru nodul sursÄ Či adresa funcČiei `expand` Či se cere sÄ implementaČi algoritmul de dfs Či sÄ printaČi nodurile ĂŽn momentul ĂŽn care le viziaČi. -Printarea se va realiza prin apelara funcČiei `printf`. Se depuncteazÄ folosirea macro-ului `PRINTF32`. +Printarea se va realiza prin apelara funcČiei `printf`. + +### Depunctari + +| Descriere | Depunctare | +| --- | --- | +| Folosire macro PRINTF32 | -10p | +| SoluČie nerecursivÄ | -20p |