il compte le nombre de cases autour qui sont un 1.
Cet algorithme est en effet plus performant que ce que j'essayais de te faire faire =)
Je te donne un exemple de ce qu'il te manquait pour t'assurer d'avoir supprimé toutes les impasses:
Labyrinthe de départ (celui donné dans ton exemple):
0 1 1 1 1 1 1 1 1
0 0 0 0 0 1 1 1 1
0 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 0
0 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0
Après une première passe (le résultat peut varier en fonction de l'ordre dans lequel tu parcours toutes tes cases:
0 1 1 1 1 1 1 1 1
0 0 0 0 1 1 1 1 1
0 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 1
0 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0
Il faut que tu refasses une passe pour continuer à virer les cases, et ce jusqu'à ce que le labyrinthe avant la passe et le labyrinthe après la passe soient égaux (signe qu'il n'y a plus d'impasse).
le code à implémenter serait donc le suivant, notant X ton labyrinthe:
je ne suis pas sûr qu'un simple X!=X2 suffise pour une matrice et je n'ai pas Matlab pour vérifier, mais avec ça tu as l'idée. suppressionimpasses est la méthode que tu as implémentée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 X=[0 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0] X2=[]; while(X!=X2) X2=X; X=suppressionimpasses(X); end
Mais restes en à la proposition de Maleaume, elle devrait faire le travail bien plus rapidement.
Partager