Trouvez le nombre d'îles ou de grappes (clusters)
Etant donnée une matrice de 0 et de 1, trouvez le nombre total de grappes formées d'éléments de valeur 1
Un groupe de 1 connectés forme une graphe
le problème est similaire aux composants connectés dans un graphique. aussi, avant de commencer à résoudre le problème, nous devons comprendre la notion de composants connectés dans un graphique.
Un composant connecté d'un graphe non orienté est un sous-graphe dans lequel tous les deux sommets sont connectés l'un à l'autre par un ou plusieurs chemins, et qui n'est connecté à aucun autre sommet en dehors du graphe.
Par exemple, le graphe présenté ci-dessous a trois composantes connexes.
Un graphe où tous les sommets sont connectés les uns aux autres a exactement un composant connecté, constitué du graphe entier. Un tel graphe avec un seul composant connecté est appelé graphe fortement connecté.
- traiter une matrice donnée comme un graphe
- l'élément de valeur 1 est considéré comme un sommet.
- les sommets adjacents de valeur 1 sont voisins
- Trouver le nombre de composants connectés dans le graphe
- Initialiser le compteur à 0, Initialiser un tableau 2D (visited) d'un booléen de taille égale à la matrice donnée
- pour chaque élément graphe[i][j], si égal à 1 et visited est faux, alors
- incrémenter le compteur de 1
- lancer le parcours en profondeur sur cet élément, cette recherche en profondeur marquerait tous les sommets qui sont directement ou indirectement connectés à cet élément comme visité
- répéter l'étape 2 pour tous les éléments d'une matrice 2D donnée
- retourner le compteur
graphe = [[1, 0, 1, 0, 1], [1, 1, 0, 0, 0], [0, 1, 0, 1, 1]] row = len(graphe) col = len(graphe[0]) def estsommet(i, j, visited): global graphe, row, col # vérifier si les indices sont valides, graphe[i][j]=1 et visited[i][j]=false return (i >= 0 and i < row and j >= 0 and j < col and not visited[i][j] and graphe[i][j]) def PARCOURPROFONDEUR(i, j, visited): # indices des voisins (8 éléments) # -1 colonneou ligne précedente ; 0 meme ligne ou colonne, 1 ligne ou colonne suivante VLignes = [-1, -1, -1, 0, 0, 1, 1, 1] VCol = [-1, 0, 1, -1, 1, -1, 0, 1] # marquer cette cellule comme visitéé visited[i][j] = True # Répéter pour tous les voisins connectés for k in range(8): if estsommet(i + VLignes[k], j + VCol[k], visited): PARCOURPROFONDEUR(i + VLignes[k], j + VCol[k], visited) def clusters(): global graphe, row, col # Initialiser le tableau visited à false visited = [[False for j in range(col)]for i in range(row)] # initialiser le compteur à 0 # parcourir les cellules count = 0 for i in range(row): for j in range(col): # SI Cellule est non visitée et contient la valeur 1 if visited[i][j] == False and graphe[i][j] == 1: # visiter les cellules de la grappe # incrémenter le compteur PARCOURPROFONDEUR(i, j, visited) count += 1 return count print("Nombre de grappes est :") print(clusters())