Parcours d'un tableau en C

Fermé
DCTProgra - 9 janv. 2018 à 14:45
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 28 févr. 2018 à 12:19
Bonjour, j'ai un projet à faire en programmation consistant à faire un algorithme permettant d'ouvrir un tableau de taille aléatoire et ensuite le parcourir ce tableau sous la forme d'un labyrinthe sachant que les 9 représente des murs, les 0 représente des vide (chemin), le 1 étant le départ et le 2 étant l'arrivée voila un exemple :

0;0;2;9;0
0;9;0;0;0
0;0;9;9;0
9;0;9;0;0
9;0;1;0;9

Le chemin ne doit pas forcément être le plus court il faut juste en trouver un qui soit bon. Je précise que je suis vraiment un débutant en C et en consultant plusieurs sites je ne sais pas comment ni par ou commencer j'ai vu des post sur des algorithmes de pathfinding ou algorithme de parcours en profondeur. Svp aidez moi merci d'avance.

1 réponse

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
28 févr. 2018 à 12:19
Bonjour,

L'idéal serait de traduire ta matrice sous la forme d'un graphe pondéré orienté :
  • chaque case dont la valeur diffère de 9 correspond à un sommet
  • chaque direction (nord, ouest, est, sud) connectant deux cases dont la valeur diffère de 9 correspond à un arc
  • comme tous les mouvements ont le même coût, on mettrait le même poids (strictement positif) sur chacun des arc (par exemple 1).


Une fois le graphe construit, il suffit d'utiliser l'algorithme de Dijkstra. Le sommet source correspond à celui associé à la case 1. Une fois l'arbre de plus courts chemins calculés, il suffit d'extraire la branche qui emmène au sommet associé à la case 2. Note que dans le cas où tu pars sur cet algorithme, tu as meilleur temps de représenter ton graphe par une matrice A, ou la case A[u][v] contient le poids de l'arc connectant le sommet u au sommet v du graphe. Tu aurais donc typiquement A[u][v] == 1 si la case associée au sommet u est voisine de la case associée au sommet v et A[u][v] = INFINITY (avec INFINITY une valeur très grande) dans le cas contraire.

D'autres algorithmes pourraient faire l'affaire une fois le graphe construit. Par exemple un simple BFS (ou un DFS) peut permettre de trouver un chemin mais calculerait un chemin sous optimal dans le cas général. À noter que l'algorithme de Dijkstra est une version améliorée de BFS.

Note aussi que dans ton cas ton graphe peut être vu comme non orienté (A[u][v] == A[v][u]) et donc tu pourrais considérer par exemple l'algorithme de Prim et extraire de l'arbre couvrant un chemin (sous optimal dans le cas général).

Bref le sujet est très souple, et tout dépend du compromis que tu cherches (entre facilité de programmation et optimalité).

Bonne chance
0