Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Ce farmacie VET online care "...

De unde cumparați legume si fructe?

Samsung S21 ultra

Plasa de umbrire peste gard de pl...
 O smecherie pe care nu o inteleg

Balcon parter fara acte

unde gasesc un speed bag in bucur...

Programe TV cu altfel de sporturi
 Laptop "bun la toate" max...

navigatie noua vw tiguan

ctfmon.exe - System Error (in Saf...

Ați prins vremurile cand 120 Volț...
 Whatsapp nu afișeaza numele ...

Medii admitere Politehnica Bucure...

Se extinde Baza de la Kogalniceanu

Politist mutilat de caine in curt...
 

[Tema] "Vecini" matrice

- - - - -
  • Please log in to reply
12 replies to this topic

#1
1marius1

1marius1

    Member

  • Grup: Members
  • Posts: 587
  • Înscris: 29.03.2012
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
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
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.


#3
jdavyd

jdavyd

    Member

  • Grup: Members
  • Posts: 323
  • Înscris: 24.07.2014
Poti folosi si Lee.

#4
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postjdavyd, on 23 iulie 2016 - 14:18, said:

Poti folosi si Lee.
Ca sa gaseasca ruta catre care punct si in care labirint?

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.

#5
jdavyd

jdavyd

    Member

  • Grup: Members
  • Posts: 323
  • Înscris: 24.07.2014
Eu am rezolvat problema cu Lee.

#6
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postjdavyd, on 24 iulie 2016 - 19:14, said:

Eu am rezolvat problema cu Lee.
Leeul ala al tau e o forma de flood fill.

#7
jdavyd

jdavyd

    Member

  • Grup: Members
  • Posts: 323
  • Înscris: 24.07.2014
Da probabil, nerecursiva.

#8
1marius1

1marius1

    Member

  • Grup: Members
  • Posts: 587
  • Înscris: 29.03.2012

View PostOriginalCopy, 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
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Post1marius1, 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?
Coordonatele într-o matrice sunt pozitive, deci x și y sunt unsigned.

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
1marius1

1marius1

    Member

  • Grup: Members
  • Posts: 587
  • Înscris: 29.03.2012
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).

#11
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,183
  • Înscris: 24.02.2007
** se pun intre int si matrix, nu dupa matrix.

#12
1marius1

1marius1

    Member

  • Grup: Members
  • Posts: 587
  • Înscris: 29.03.2012
#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
jdavyd

jdavyd

    Member

  • Grup: Members
  • Posts: 323
  • Înscris: 24.07.2014
Pointerii sunt niste adrese, si se utilizeaza in alocarea dinamica a memoriei, este facut un pinned post despre pointeri chiar pe forum.




Anunturi

Chirurgia cranio-cerebrală minim invazivă 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

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate