| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 
 |  
# -*-coding:utf-8-*-
 
"""
    
    INITIALISATION DE L'ECHIQUIER
    
"""
 
# On crée un échiquier remplit de 0 (de taille m x m)
# Le programme marche avec m=5 en quelque seconde, mais même après plusieurs minutes ne trouve rien avec m=8
 
m = 5
Echiquier = [[0 for i in range(m)] for j in range(m)]
 
 
"""
 
    DÉFINITION DE LA CLASSE
    
"""
 
class Vecteur():
 
    """ Permet de retrouver x et y entré en argument avec pos.x et pos.y """
    # Classe inutile, permet juste la simplification de la lecture du code
 
    def __init__(self, x, y):
        self.x = x
        self.y = y
 
 
"""
   
   DÉFINITION DES DIFFÉRENTES FONCTIONS
    
"""
 
def Afficher(grille):
 
    """ On affiche la grille pour plus de lisibilité """
 
    print '\n'
 
    # On écrit les lignes une par avec indication du numéro la ligne
    for i,g in enumerate(grille): print i,g
 
 
def cases_accessibles(pos):
 
    """ Fonction retournant les cases accesible par le cavalier en position pos sur l'Echiquier """
    # Tous les mouvements possible par le cavalier
    Mouvements = [[1,2],[2,1],[2,-1],[1,-2],[-1,-2],[-2,-1],[-2,1],[-1,2]]
 
    # On initialise la liste CA qui contiendra toutes les cases accessibles par le cavalier
    CA = []
 
    # Pour chaque mouvement contenu dans les mouvements possibles
    for mouvement in Mouvements:
        # On creer un vecteur pour que la suite soit plus lisible
        m = Vecteur(mouvement[0],mouvement[1])
 
        # new est la case que l'on atteint en effectuant le mouvement m
        new = [pos.x + m.x, pos.y + m.y]
 
        # On verifie que la case ne se trouve pas en dehors de l'echiquier
        if new[0] >= 0 and new[0]<len(Echiquier[0]) and new[1] >= 0 and new[1]<len(Echiquier):
            # On regarde si cette case n'a pas deja ete utilisee
            if Echiquier[new[0]][new[1]] == 0 :
                # On ajoute la case new aux cases accessibles par le cavalier
                CA.append(new)
 
    # On retourne toutes les cases accessibles par le cavalier
    return CA
 
 
 
def cases_restantes():
 
    """ Retourne le nombre de cases restante (=0) dans l'Echiquier """
    cases = 0
    # On parcours l'échiquier et incrémente 1 à chaque fois qu'on recontre 0 (Case libre)
    for i in range(len(Echiquier)):
        for j in range(len(Echiquier[0])):
            if Echiquier[i][j] == 0: cases +=1
 
    # On retourne le nombre de cases restante (=0) sur l'échiquier
    return cases
 
 
 
def parcours(pos, n = 0):
 
    """ Fonction récursive retournant Vrai ou Faux sur la validité du parcours et le complétant """
    # On ajoute 1 au numéro de case à chercher
    n+=1
 
    # Inutile, permet juste de suivre son fonctionnement
    print '\n---------------------------'
    print 'On met le cavalier n°%d à la case (%d, %d)' % (n, pos.x, pos.y)
    print cases_accessibles(pos)
 
    # On met le cavalier à la position entré en argument.
    Echiquier[pos.x][pos.y] = n
    Afficher(Echiquier)
 
    # S'il ne reste aucune case libre, ça veut dire que le problème est résolu !
    if cases_restantes() == 0:
        Afficher(Echiquier)
        return True
 
    # Sinon pour chaques cases accessibles par le cavalier on vérifie si la case suivante permet d'aboutir à une solution
    for c in cases_accessibles(pos):
        case = Vecteur(c[0],c[1])
        print 'On est à la position (%d, %d) se dirige vers la case (%d, %d)' % (pos.x, pos.y, case.x, case.y)
        if parcours(case,n):
            return True
 
    # Si on a testé toutes les possibilités de cette case on la remet à 0 et on passe à la case suivante
    print 'On remet à 0 la case (%d, %d)' % (pos.x, pos.y)
    Echiquier[pos.x][pos.y] = 0
    return False
 
 
def main(x,y):
    """ Programme principale appelant tous les autres et initialisation de params """
    # On cree un Vecteur position pour que ce soit plus lisible
    pos = Vecteur(x,y)
    # On appelle le programme permettant la résolution du problème
    parcours(pos)
 
# Le cavalier aura pour position de départ la case (0,0)
main(0,0) | 
Partager