MP1 2015 - 2016 Lycée Janson de Sailly DS n°1 d’informatique pour tous
Analyse d’une fonction mystere.
Considérons la fonction ci-dessous :
def mystere(p) :
"""p est une pile"""
if p[0] == 0 :
return "Pile Vide"
elif p[0] == 1 :
return depiler(p)
else :
a = depiler(p)
b = depiler(p)
if a < b :
empiler(p, a)
else :
empiler(p, b)
return mystere(p)
a) Démontrer la terminaison de cette fonction récursive.
b) Expliquer le rôle de cette fonction. Que renvoie l’appel ci-
dessous?
mystere( [15, [24, 45, 2, 3, 2, 6, 8, 9, 9, 10, 9, 3, 6, 7, 8]])
4 Le jeu du Sudoku
Un Sudoku n’est pas tant un jeu axé sur les nombres mais un puzzle
de placement de symboles, même si les Sudokus communément utilisés
font usage des nombres arabes de 1 à 9.
Le but d’un Sudoku, sous la forme d’une grille 9 ×9, avec un
numéro par cellule et un certain nombre de cellules remplies initia-
lement, est de compléter la grille en respectant quelques contraintes
simples :
— Aucun chiffre ne peut être répété dans chaque sous-grille 3 ×3.
— Aucun chiffre ne peut être répété sur la même ligne.
— Aucun chiffre ne peut être répété sur la même colonne.
Python Algorithmique
3 4 1 8 7
9 5 6
4 7 9 5 3
7 3 2 4
7 8 2 4
6 2 8 3 5
5 1 3
1 3 2 4 9 6
n=35casessontrempliesinitialementdanscettegrille.
On représentera dans ce problème une grille de Sudoku par une liste de listes, chaque élément de la liste
principale représentant une ligne de la grille. L’absence dechiffre dans une ligne sera indiquée par un zéro.
Ainsi, la grille précédente se met sous la forme :
G=[[3,0,0,4,1,0,0,8,7],
[0,0,9,0,0,5,0,6,0],
....... ,
[1,3,0,0,2,4,0,9,6]]
On souhaite écrire un programme qui complète automatiquement la grille de Sudoku. L’algorithme
proposé utilise la technique du backtracking (ou retour sur trace). Elle consiste à revenir légèrement en
arrière sur des décisions prises afin de sortir d’un blocage. Elle correspond à peu près à la technique manuelle
qui consiste lorsqu’il y a plusieurs possibilités (Sudoku non trivial), à essayer un premier chiffre , puis tenter
de compléter la grille; si cela devient impossible, on gomme le premier chiffre, on le remplace par un autre
possible, puis on recommence ...
L’algorithme va nous permettre d’effectuer cette méthode d’essais et erreurs automatiquement.
1. On imagine résoudre le Sudoku par une méthode de « force brute », c’est-à-dire que l’on écrit toutes
les possibilités de remplissage sans contraintes, puis on cherche la bonne en testant si les contraintes
sont vérifiées. Quelle serait la complexité temporelle dans le pire des cas d’une telle méthode si ncases
sont initialement remplies? Vous semble-t-elle applicable?
2. Fonctions de test de contraintes
On cherche à vérifier si une valeur kest présente ou absente de la ligne, colonne, ou sous-grille 3×3.
Les cellules sont numérotées [i, j], avec i, j ∈[0,8].
(a) Écrire une fonction absent_ligne(k, G, i) qui renvoie True si le chiffre kest absent dans la
i-ème ligne de la grille G,ouFalse sinon.
De même, écrire une fonction absent_colonne(k, G, j) qui renvoie True si le chiffre kest
absent dans la j-ème colonne de la grille G,ouFalse sinon.
(b) Écrire une fonction absent_bloc(k, G, i, j) qui renvoie True ou False suivant que le chiffre
kest absent dans le bloc qui contient la cellule [i, j].
3. Fonctions de position
Il sera utile pour la fonction principale de pouvoir passer del’écritureproposéedeGàuneécriture
unidimensionnelle de la forme :
GU =[3,0,0,4,1,0,0,8,7,0,0,9,0,0,5,0,6,0,...0,9,6]
ou réciproquement.
(a) Expliquer le fonctionnement de la fonction récursive suivante :
def aplatir(i, j):
if i== 0 and j== 0:
return 0
if j>0:
Lycée Chaptal MP IPT,O. Arnoult Novembre 2015 Page 3/4
Voici un exemple de grille initiale
sur la figure suivante :
On représentera dans ce problème
une grille de Sudoku par une liste
de listes, chaque élément de la liste
principale représentant une ligne de
la grille. L’absence de chiffre dans
une ligne sera indiquée par un zéro.
Ainsi, la grille ci-contre se met sous
la forme :
G = [ [3, 0, 0, 4, 1, 0, 0, 8, 7], [0, 0, 9, 0, 0, 5, 0, 6, 0], ....... , [1, 3, 0,
0, 2, 4, 0, 9, 6] ]
On souhaite écrire un programme qui complète automatiquement
la grille de Sudoku. L’algorithme proposé utilise la technique du
backtracking (ou retour sur trace). Elle consiste à revenir légèrement
en arrière sur des décisions prises afin de sortir d’un blocage. Elle
correspond à peu près à la technique manuelle qui consiste lorsqu’il
y a plusieurs possibilités (Sudoku non trivial), à essayer un premier
chiffre , puis tenter de compléter la grille; si cela devient impossible,
on gomme le premier chiffre, on le remplace par un autre possible,
puis on recommence ...
L’algorithme va nous permettre d’effectuer cette méthode d’essais
et erreurs automatiquement.
1. Fonctions de test de contraintes. On cherche à vérifier si une
valeur kest présente ou absente de la ligne, colonne, ou sous-
grille 3 ×3. Les cellules sont numérotées [i, j], avec (i, j)∈
[[0,8]] ×[[0,8]].
3