Chirurgia cranio-cerebrală minim invazivă
Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne. Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale. www.neurohope.ro |
[Tema] "Vecini" matrice
Last Updated: Jul 27 2016 14:30, Started by
1marius1
, Jul 23 2016 12:44
·
0
#1
Posted 23 July 2016 - 12:44
Salut din nou!
Problema: [ https://i.imgur.com/cxiudML.jpg - Pentru incarcare in pagina (embed) Click aici ] Am rezolvato partial:
Spoiler
Am facut o functie care verifica fiecare vecin al fiecarei valori 1. Afiseaza corect grupurile, dar nu stiu cum sa fac sa le numar... Cred ca functia nu e corecta, dar nu prea am alte idei... |
#2
Posted 23 July 2016 - 13:13
Iterezi ce iterezi pana dai de 1, faci flood fill pentru toate elementele ce contin 1 - pas in care marchezi si in matricea originala elementele filled cu 2 in loc de 1, si incrementezi numarul grupurilor cu 1 si construiesti lista elementelor din grupul curent.
Apoi iterezi in continuare pana cand dai iar de 1 (caci cele deja flooded in alt grup nu mai sunt 1, ci 2). Pe cod nu m-am uitat cu atentie, dar e gresit pentru ca nu vad sa foloseasca vreo constanta speciala gen '2', si nici nu pare sa construiasca un graf (cealalta abordare posibila, in afara de flood fill). Deci n-are rost sa ma uit cu atentie pe un cod gresit. Deci sparge problema mare in mai multe subprobleme. Prima ta subproblema: flood fill. Fa o functie unsigned int flood_fill(int matrix**, unsigned int matrix_size, Point start, int lookup_value, int visited_value,Point** points_matching) Point e o structura cu doi membri x,y cu coordonatele unui singur punct. lookup_value e in cazul tau constanta 1. visited_value e constanta 2. Iar start e punctul de pornire. Apoi vei apela aceasta functie in bucla mare in care iterezi matricea. Functia returneaza numarul de puncte din grupul curent (numarul de elemente Points in blocul de memorie de la adresa points_matching). Daca acesta nu este 0, incrementezi numarul de grupuri, si colectezi points_matching intr-o variabila declarata in main ca Point***. Functia are deci doua outputuri, points_matching si valoarea returnata. Edited by OriginalCopy, 23 July 2016 - 13:26. |
#4
Posted 24 July 2016 - 10:14
jdavyd, on 23 iulie 2016 - 14:18, said:
Poti folosi si Lee. Pe lee il poti folosi daca il modifici asa incat devine o forma sau alta de flood fill in termeni de idei exprimate prin cod. Nu mai emiteti aberatii care doar ii fac si mai confuzi pe cei mai putin experimentati. Nu d-alta, dar si asa are "grija" scoala de ei, si chiar pot pune botul la aberatii. |
#6
Posted 24 July 2016 - 19:19
#8
Posted 25 July 2016 - 16:03
OriginalCopy, on 23 iulie 2016 - 13:13, said:
Iterezi ce iterezi pana dai de 1, faci flood fill pentru toate elementele ce contin 1 - pas in care marchezi si in matricea originala elementele filled cu 2 in loc de 1, si incrementezi numarul grupurilor cu 1 si construiesti lista elementelor din grupul curent. Apoi iterezi in continuare pana cand dai iar de 1 (caci cele deja flooded in alt grup nu mai sunt 1, ci 2). Pe cod nu m-am uitat cu atentie, dar e gresit pentru ca nu vad sa foloseasca vreo constanta speciala gen '2', si nici nu pare sa construiasca un graf (cealalta abordare posibila, in afara de flood fill). Deci n-are rost sa ma uit cu atentie pe un cod gresit. Deci sparge problema mare in mai multe subprobleme. Prima ta subproblema: flood fill. Fa o functie unsigned int flood_fill(int matrix**, unsigned int matrix_size, Point start, int lookup_value, int visited_value,Point** points_matching) Point e o structura cu doi membri x,y cu coordonatele unui singur punct. lookup_value e in cazul tau constanta 1. visited_value e constanta 2. Iar start e punctul de pornire. Apoi vei apela aceasta functie in bucla mare in care iterezi matricea. Functia returneaza numarul de puncte din grupul curent (numarul de elemente Points in blocul de memorie de la adresa points_matching). Daca acesta nu este 0, incrementezi numarul de grupuri, si colectezi points_matching intr-o variabila declarata in main ca Point***. Functia are deci doua outputuri, points_matching si valoarea returnata. Point este o structura de genul? struct Point { int x; int y; }start,points_matching; De ce ai pus la matrix doua stelute( ** ) ? Point** points_matching Si aici de ce ai pus doua stelute ? "Functia returneaza numarul de puncte din grupul curent (numarul de elemente Points in blocul de memorie de la adresa points_matching)." adica numara adresele unde se afla 1? points_matching sunt adresele unde apare 1? Edited by 1marius1, 25 July 2016 - 16:15. |
#9
Posted 25 July 2016 - 18:09
1marius1, on 25 iulie 2016 - 16:03, said: Point este o structura de genul? struct Point { int x; int y; }start,points_matching; De ce ai pus la matrix doua stelute( ** ) ? Point** points_matching Si aici de ce ai pus doua stelute ? "Functia returneaza numarul de puncte din grupul curent (numarul de elemente Points in blocul de memorie de la adresa points_matching)." adica numara adresele unde se afla 1? points_matching sunt adresele unde apare 1? Lista de puncte are mărime variabilă, nu o știi la compilare, deci trebuie să o aloci dinamic (read: pointeri). Point* ar fi fost dacă ai fi avut un singur punct alocat dinamic, însă ai o listă, deci trebuie să salvezi o listă de pointeri, deci Point**. Cât despre ultimele tale două întrebări: da la ambele. A, și dacă aloci / realoci lista de puncte în interiorul funcției, atunci trebuie să îi pasezi Point***, cu 3 nivele de indirecție. |
#10
Posted 25 July 2016 - 21:55
Primesc erori la compilare.
Programul nu e gata, dar voiam sa vad daca macar "trece de compilator". #include <iostream> #include <fstream> using namespace std; struct Point { unsigned x; unsigned y; }start,points_matching; unsigned int flood_fill(int matrix**, unsigned int matrix_size, Point start, int lookup_value, int visited_value,Point** points_matching) { int count=0; if(start.x<0 || start.x>=matrix_size || start.y<0 || start.y>=matrix_size) return 0; if (matrix[start.x][start.y]!=lookup_value) return 0; matrix[start.x][start.y]=visited_value; start.x=start.x+1; flood_fill(matrix,matrix_size,start,1,2,points_matching); start.x=start.x-1; flood_fill(matrix,matrix_size,start,1,2,points_matching); start.y=start.y+1; flood_fill(matrix,matrix_size,start,1,2,points_matching); start.y=start.y-1; flood_fill(matrix,matrix_size,start,1,2,points_matching); } ifstream fin("matrice.txt"); main() { int n,i,j; Point*** adrese; do { cin>>n; }while(n<2); int matrice[n][n]; for(i=0;i<n;i++) for(j=0;j<n;j++) fin>>matrice[i][j]; //le citesc din fisier ca sa nu le mai scriu eu pentru teste... } Erorile pe care le primesc: 12 35 E:\Info\Facultate\2012 septembrie\S II _ 5.cpp [Error] expected ',' or '...' before '*' token E:\Info\Facultate\2012 septembrie\S II _ 5.cpp In function 'unsigned int flood_fill(int)': 16 27 E:\Info\Facultate\2012 septembrie\S II _ 5.cpp [Error] 'matrix_size' was not declared in this scope 17 23 E:\Info\Facultate\2012 septembrie\S II _ 5.cpp [Error] invalid types 'int[unsigned int]' for array subscript 17 35 E:\Info\Facultate\2012 septembrie\S II _ 5.cpp [Error] 'lookup_value' was not declared in this scope Si nu stiu cum sa scriu instructiunile pentru ca points_matching sa primeasca coordonatele. Points_matching este ca o matrice, sau cum poate memora mai multe valori? Poate sunt intrebari ciudata, dar nu am folosit niciodata asa ceva si nici nu am invatat... Daca vrei poti sa imi dai si un link de unde sa citesc cum fuctioneaza si la ce se folosesc(poate sa fie si in engleza). |
|
#12
Posted 27 July 2016 - 13:10
#include <iostream> #include <fstream> using namespace std; struct Point { unsigned x; unsigned y; }start,points_matching; unsigned int flood_fill(int matrix[][100], unsigned int matrix_size, Point start, int lookup_value, int visited_value,int count) { if(start.x<0 || start.x>=matrix_size || start.y<0 || start.y>=matrix_size) return 0; if (matrix[start.x][start.y]!=lookup_value) return 0; matrix[start.x][start.y]=visited_value; cout<<start.x<<" "<<start.y<<"; "; count++; start.x=start.x+1; flood_fill(matrix,matrix_size,start,1,2,count); start.x=start.x-2; flood_fill(matrix,matrix_size,start,1,2,count); start.x=start.x+1; start.y=start.y+1; flood_fill(matrix,matrix_size,start,1,2,count); start.y=start.y-2; flood_fill(matrix,matrix_size,start,1,2,count); if(count) cout<<endl; return count; } ifstream fin("matrice.txt"); main() { int n,i,j,nr_grupuri=0,aux; do { fin>>n; }while(n<2); int matrice[n][100]; for(i=0;i<n;i++) for(j=0;j<n;j++) fin>>matrice[i][j]; for(i=0;i<n;i++) for(j=0;j<n;j++) { start.x=i; start.y=j; aux=flood_fill(matrice,n,start,1,2,0); if(aux) nr_grupuri++; } cout<<"Numarul de grupurie este: "<<nr_grupuri; } Atat am reusit sa fac... Nu inteleg cum se lucreaza cu pointeri aia(cred ca pointeri se numesc stelutele).... Daca mi-ar putea explica cineva, as ramane recunoscator... Nu stiu cum sa memorez valorile in ei si cum sa ii afisez... |
#13
Posted 27 July 2016 - 14:30
Pointerii sunt niste adrese, si se utilizeaza in alocarea dinamica a memoriei, este facut un pinned post despre pointeri chiar pe forum.
|
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users