CCINP Informatique Commune TSI 2026Sujet
- Manipulation de listes et de dictionnaires en Python
- Complexité algorithmique
- Génération et test de permutations
- Récursivité et algorithme de retour sur trace
- Bases de données relationnelles et langage SQL
Téléchargements
- Corrigé : pas encore disponible
- Rapport du jury : pas encore publié
Présentation du sujet
Le problème des n reines par recherche aléatoire, exhaustive et parcours de graphe, et base de données d'un site de jeuxAfficher ou masquer la section
Présentation du sujet
Le sujet regroupe deux parties indépendantes d'informatique. La première fait résoudre le problème des n reines en Python selon plusieurs approches, de la recherche aléatoire à un parcours de graphe par retour sur trace, en passant par la génération de toutes les permutations et leur classification par symétrie. La seconde fait écrire des requêtes SQL sur la base de données d'un site de jeux en ligne.
- 1I.1 à I.3 : modélisation et validation d'une configurationFait coder une configuration de reines par une liste, écrire des fonctions d'affichage d'une grille et une fonction testant si une configuration respecte les contraintes du problème.
- 2I.4 et I.5 : recherche aléatoire puis exhaustive par permutationsFait chercher une solution par génération de permutations aléatoires, puis générer récursivement toutes les permutations pour obtenir l'ensemble des configurations solutions.
- 3I.6 : classement des configurations similairesFait écrire des fonctions de symétrie et de rotation d'une configuration pour regrouper les solutions qui se déduisent les unes des autres par ces transformations.
- 4I.7 : résolution par parcours de grapheFait compléter un algorithme récursif de parcours de graphe avec retour en arrière pour trouver une solution ou compter toutes les solutions, plus rapide que l'énumération de toutes les permutations.
- 5II. Base de données d'un serveur de jeu en ligneFait écrire des requêtes SQL sur une base de données à quatre tables (clients, jeux, factures, records) pour extraire des informations sur les clients, leurs achats et les meilleurs scores.
L'épreuve en chiffres
Moyenne 10,31 / 20 · écart-type 4,73 · 1 385 présents · où vous situez-vous ?Afficher ou masquer la section
L'épreuve en chiffres
- Moyenne
- 10,31/ 20
- Écart-type
- 4,73
- Présents
- 1 385
- Coefficient
- 4
- Durée
- 3 h
Votre note sur 20 à ce sujet, en conditions de concours.
Source : document officiel du concours, épreuve du 22 avril 2026. Notes publiées par le concours (après harmonisation le cas échéant). Courbe : estimation par une loi normale.
Ces sujets peuvent vous intéresser
Pas encore de corrigé pour ce sujet : voici des sujets proches corrigés.
Lecture du sujet en ligne
L'énoncé complet, avec les formules et les figures, sans ouvrir le PDF.Afficher ou masquer la section
Lecture du sujet en ligne
ÉPREUVE SPÉCIFIQUE - FILIÈRE TSI
INFORMATIQUE
N.B. : le candidat attachera la plus grande importance à la clarté, à la précision et à la concision de la rédaction. Si un candidat est amené à repérer ce qui peut lui sembler être une erreur d'énoncé, il le signalera sur sa copie et devra poursuivre sa composition en expliquant les raisons des initiatives qu'il a été amené à prendre.
- -Utiliser uniquement un stylo noir ou bleu foncé non effaçable pour la rédaction de votre composition ; d'autres couleurs, excepté le vert, bleu clair ou turquoise, peuvent être utilisées, mais exclusivement pour les schémas et la mise en évidence des résultats.
- -Ne pas utiliser de correcteur.
- -Écrire le mot FIN à la fin de votre composition.
Autour de jeux
Partie I - Des algorithmes pour résoudre le problème des n reines
- -les sous-parties I. 4 et I. 5 nécessitent d'admettre la question Q11 si elle n'a pas été traitée;
- -la sous-partie I. 6 nécessite d'admettre la question Q17 si elle n'a pas été traitée;
- -la sous-partie I. 7 nécessite d'admettre la question Q10 si elle n'a pas été traitée.
Les jeux de société (échecs, dames, reversi, awale, etc.) sont une grande source d'inspiration pour tester l'efficacité de différents algorithmes.
Nous nous proposons ici d'en étudier plusieurs autour d'un défi issu du jeu d'échecs.
Considérons une grille de taille
On cherche à placer n reines dans cette grille de telle façon qu'il n'y ait pas plus d'une reine sur chaque ligne, sur chaque colonne et sur chaque diagonale montante ou descendante


I. 1 - Introduction



I. 2 - Mise en place d'un affichage
- Q3.Écrire une fonction ligne prenant pour paramètre un entier naturel n et qui renvoie une liste de taille n constituée uniquement de 0.
Par exemple, pourn = 5 , l'appel ligne(5) renverra [0, 0, 0, 0, 0].
Remarque : l'utilisation de structures de données du module numpy comme array n'est pas autorisée. - Q4.Écrire une fonction grille prenant pour paramètre un entier n et qui renvoie une liste de n listes distinctes, chacune contenant n fois l'entier 0.
Parexemple, pourn = 3 , l'appel grille (3) renverra [[0, 0, 0 ], [0, 0, 0], [0, 0, 0]].
- Q5.Compléter la fonction remplir prenant pour paramètre une liste L de taille n représentant une configuration. Cette fonction crée une grille de taille
n × n ne contenant que des zéros. Puis, elle remplaceG[i][j] par la valeur 1 lorsqueL[i] = j . Enfin, elle renvoie la grille ainsi obtenue.
Remarque : une fonction ayant une complexité temporelle en O(len(L)) (c'est-à-dire linéaire en la taille de la liste) sera valorisée.
Par exemple, pourn = 4 :>>> G = remplir([1, 3, 0, 2]) >>> G [[0, 1, 0, 0], [0, 0, 0, 1], [1, 0, 0, 0], [0, 0, 1, 0]] - Q6.La représentation des grilles produite par l'interpréteur n'est pas visuellement satisfaisante (pour l'utilisateur). Écrire une fonction affiche qui prend pour paramètre une grille G, qui ne renvoie rien mais affiche la grille G ligne par ligne.
Par exemple :>>> G = remplir([1, 3, 0, 2]) >>> G [[0, 1, 0, 0], [0, 0, 0, 1], [1, 0, 0, 0], [0, 0, 1, 0]] >>> affiche(G) [0, 1, 0, 0] [0, 0, 0, 1] [1, 0, 0, 0] [0, 0, 1, 0]
I. 3 - Tester si une configuration est valide
- -(a) tous les L[i] sont distincts;
- -(b) tous les L[i]+i sont distincts;
- -(c) tous les L[i]-i sont distincts;
- -(d) cette liste L est de taille n.
- Q7.Expliquer ce que traduit d'une part le respect de (a) et d'autre part le respect de (b) et (c) pour le problème considéré.
- Q8.Écrire une fonction tous_distincts prenant en paramètre une liste L de positions et renvoyant True si tous ses éléments sont distincts, False sinon. Cette fonction procède comme suit :
- -on initialise un dictionnaire presents vide;
- -on parcourt la liste L. Si on rencontre un élément x non encore présent parmi les clés du dictionnaire, on insère la clé x dans le dictionnaire avec comme valeur le booléen True (par exemple). Si par contre cet élément est déjà présent, on quitte la fonction en renvoyant le booléen False ;
- -si le parcours complet de la liste n'a pas repéré de doublon, on renvoie True.
def tous_distincts2(L):
n = len(L)
for i in range(n):
for j in range(i,n):
if L[i] == L[j]:
return True
return False
- Q9.Écrire une version corrigée de la fonction tous_distincts2. Comparer la complexité temporelle des codes tous_distincts et tous_distincts2 (corrigé) dans le pire des cas, ceci pour une liste L de taille n donnée en paramètre. On justifiera en s'aidant des rappels sur la complexité donnés en annexe 2.
- Q10.Écrire une fonction est_possible prenant en paramètre une liste L de positions et qui renvoie un booléen indiquant si L satisfait simultanément les trois conditions (a), (b) et (c), ou pas. On pourra utiliser plusieurs appels à la fonction tous_distincts. Par exemple, est_possible([2, 4, 1, 7, 0, 6, 3, 5]) renvoie True et est_possible([3, 4, 1, 7, 0, 6, 2, 5]) renvoie False.
- Q11.Écrire une fonction est_solution prenant en paramètres une liste L de positions, un entier n représentant la taille de la grille et renvoyant un booléen indiquant si L satisfait simultanément les quatre conditions (a), (b), (c) et (d), ou pas.
On part du principe que L contient uniquement des entiers de{0, 1, …, n − 1} , il est donc inutile de le vérifier.
I. 4 - Une première approche par recherche aléatoire
Par exemple, si
[0, 1, 2], [0, 2, 1], [1, 0, 2], [1, 2, 0], [2, 0, 1], [2, 1, 0].
- Q12.La fonction sample du module random peut renvoyer une permutation aléatoire d'une liste L. II y a plusieurs manières d'importer cette fonction. Sur le DR, compléter les codes pour utiliser sample comme indiqué.
Par exemple, si L = [0, 1, 2, 3, 4], sample (L, 5) pourra renvoyer [1, 0, 3, 4, 2] ou toute autre liste permutation de L.
- Q13.Écrire une fonction recherche_aleatoire prenant en paramètres deux entiers naturels non nuls n et N.
Cette fonction crée d'abord la listeL = [0, 1, …, n − 1] . Ensuite, elle crée au maximum N permutations de L et teste si elles sont solutions du problème des n reines.
Dès qu'une liste solution est trouvée, elle est renvoyée. En cas d'échec après N essais, la liste vide [] est renvoyée.
À titre documentaire, on signale qu'il est possible d'accélérer cette recherche aléatoire en utilisant le fait que lorsqu'une configuration est fausse, l'erreur vient souvent du mauvais placement des premières reines. La sous-partie I. 7 exploitera partiellement cette remarque.
On se propose dans la sous-partie suivante de procéder à une recherche exhaustive des configurations solutions, quitte à se restreindre à des entiers n plutôt petits.
I. 5 - Déterminer toutes les permutations de L =
[0, 1, …, n − 1]
- Q14.Écrire une fonction insertion prenant pour paramètres un entier x, une liste L, un indice i et renvoyant une nouvelle liste obtenue en :
- -recopiant les termes de la liste L d'indices 0 à i-1 inclus;
- -puis en ajoutant x à la position i;
- -enfin, en recopiant les termes de la liste L depuis l'indice i jusqu'à l'indice len(L)-1 inclus.
Attention : l'usage d'une quelconque fonction Python faisant cette insertion est bien sûr interdit ici.
L = [[0, 1], [1, 0]]
v = 2
P = []
for l1 in L:
for i in range(v+1):
p1 = insertion(v, l1, i)
P.append(p1)
- Q15.Quel est le contenu de P à l'issue du premier passage dans la première boucle?
Donner le contenu de P après l'exécution complète du code ci-dessus.
(On demande à chaque fois de respecter l'ordre des différents éléments de P).
Expliquez exactement ce que fait ce code.
- Q16.Compléter le code de la fonction permutations prenant en paramètre un entier n supérieur ou égal à 2 et renvoyant la liste de toutes les permutations possibles des entiers de 0 à n-1. (c'est-à-dire toutes les listes possibles contenant les entiers de 0 à n-1 une fois et une seule). Par exemple, permutations(3) renverra une liste de sous-listes de la forme suivante (les sous-listes n'étant pas forcément dans cet ordre) :
[[0, 1, 2], [0, 2, 1], [2, 0, 1], [2, 1, 0], [1, 0, 2], [1, 2, 0]]. - Q17.En déduire une fonction configurations prenant en paramètre un entier n et renvoyant la liste de toutes les configurations satisfaisant les conditions imposées par le jeu.
Cependant, on peut constater que certaines configurations sont similaires : elles peuvent se déduire les unes des autres par symétrie ou rotation. La sous-partie suivante détermine les configurations similaires.
I. 6 - Classer les configurations similaires

- Q18.On se place dans une grille de taille 5 × 5 et on considère la configuration initiale représentée par la liste
L = [2, 4, 1, 3, 0] (figure 6).
Donner, sous forme d'une liste d'entiers de 0 à 4, la liste L1 correspondant à une symétrie horizontale de la grille et la liste L2 correspondant à une rotation d'un quart de tour vers la droite de la grille.
De façon générale, comment obtient-on la liste L1 correspondant à une symétrie horizontale à partir d'une liste L initiale? - Q19.Écrire une fonction symetrie prenant en paramètre une liste L représentant une configuration et renvoyant la liste correspondant à une symétrie horizontale de la grille.
Par exemple, cette fonction appliquée à [1, 0, 2] renvoie [2, 0, 1].
Attention : l'usage de la méthode reverse, de la fonction reversed ou du slicing L[::-1] est interdit ici. - Q20.Écrire une fonction rotation prenant en paramètre une liste L représentant une configuration et renvoyant la liste correspondant à la configuration obtenue par rotation d'un quart de tour vers la droite : chaque reine à la position ligne i/colonne L[i] se retrouve, après rotation, à la position ligne L[i]/colonne n-1-i.
Par exemple, cette fonction appliquée à [2, 5, 3, 1, 7, 4, 6, 0] renvoie [0, 4, 7, 5, 2, 6, 1, 3].
On donne alors le code d'une fonction partition qui prend en paramètre un entier n.
def partition(n):
C = configurations(n)
P = []
for c in C:
test = False
for elt in P:
if similaires(elt[0],c):
elt.append(c)
test = True
if test == False:
P.append([c])
return P
Quel est le type de la variable renvoyée par l'appel partition(n) ? Décrire complètement la structure de cette variable.
Expliquer en quelques phrases comment fonctionne cette fonction partition.
1.7 - Des graphes pour aller plus vite et plus loin
La figure 7 illustre ce point de vue.
La démarche consiste à parcourir (partiellement) ce graphe depuis la situation initiale (une grille vide). On place une reine, on regarde si la configuration obtenue est valide. Si c'est le cas, on place une nouvelle reine jusqu'à obtention éventuelle d'une solution.
En cas d'échec, on revient à l'étape précédente (c'est comme si on enlevait la dernière reine jouée) et on continue avec les autres coups à tester.
Le code mis en œuvre s'inspire ainsi d'un parcours de graphe classique (et récursif).
On note que :
- -dès que l'on trouve une solution au problème, on arrête le parcours et on renvoie cette solution;
- -on revient en arrière (c'est-à-dire à l'étape précédente) quand on obtient une grille invalide ;
- -en cas de parcours complet du graphe sans avoir trouvé de solution, on renvoie la valeur -1 ;
- -on ne visite a priori pas la totalité des sommets du graphe, ce qui est un facteur de rapidité.

- Q22.Une fonction resout_graphe prend en paramètre un entier
n ⩾ 4 correspondant à la taille de la grille et renvoie une liste gagnante de positions ou -1 si aucune solution n'a été trouvée. Elle utilise une fonction explore.
Compléter les zones en pointillés dans la fonction explore pour que la fonction resout_graphe effectue le travail demandé.
- Q23.L'exploration du graphe de la question Q22 s'arrête dès qu'une solution est trouvée. On peut décider de continuer l'exploration du graphe pour déterminer les autres solutions au problème. On se propose ici de seulement compter le nombre de solutions grâce à une fonction compte prenant en paramètre un entier
n ⩾ 4 correspondant à la taille de la grille.
Compléter les zones en pointillés dans la fonction explore2 pour que la fonction compte effectue le travail demandé.
Partie II - Base de données d'un serveur de jeu en ligne
- -la table Clients contient des informations sur les utilisateurs du site. Elle est constituée des attributs suivants :
- -id_client (clé primaire) : identifiant unique du client, nombre entier ;
- -nom : nom du client, chaîne de caractères ;
- -prenom : prénom du client, chaîne de caractères ;
- -email : email du client, chaîne de caractères;
- -date_inscription : date d'inscription du client au format 'JJ-MM-AAAA';
- -anniversaire : jour anniversaire du client au format 'JJ-MM'.
- -la table Jeux contient des informations sur les jeux disponibles. Elle est constituée des attributs suivants :
- -id_jeu (clé primaire) : identifiant unique du jeu, nombre entier;
- -nom_jeu : nom du jeu, chaîne de caractères ;
- -description : brève description du jeu, chaîne de caractères;
- -prix : prix du jeu, nombre flottant.
- -la table Factures enregistre les transactions des achats de jeux. Elle est constituée des attributs suivants :
- -id_facture (clé primaire) : identifiant unique de la facture, nombre entier;
- -id_client (clé étrangère) : référence vers la table Clients, nombre entier;
- -id_jeu (clé étrangère) : référence vers la table Jeux, nombre entier;
- -date_achat : date d'achat du jeu au format 'JJ-MM-AAAA';
- -montant : montant de la facture, nombre flottant.
- -la table Records qui enregistre les records ou scores des différents utilisateurs dans les jeux qu'ils ont achetés. Elle est constituée des attributs suivants :
- -id_record (clé primaire) : identifiant unique du record, nombre entier;
- -id_client (clé étrangère) : référence vers la table Clients, entier;
- -id_jeu (clé étrangère) : référence vers la table Jeux, entier;
- -score : score du joueur pour ce jeu, nombre entier;
- -date_record : date du record au format 'JJ-MM-AAAA'.
- Q24.Le gestionnaire veut souhaiter leur anniversaire à ses clients et leur proposer un bon d'achat à cette occasion. Écrire une requête SQL permettant de récupérer le nom, le prénom et l'email des clients ayant leur anniversaire le 3 juillet.
- Q25.Le gestionnaire souhaite faire le récapitulatif des achats d'un client particulier. Écrire une requête SQL affichant le nom, le prénom et les dates des achats effectués par le client ayant pour email '[email protected]'.
- Q26.Le gestionnaire du site veut pouvoir identifier ses meilleurs clients. Écrire une requête SQL affichant le nom, l'email et le montant total dépensé pour chaque client du site. Attention, un client peut avoir fait plusieurs achats, il faudra donc faire la somme de tous ses achats.
- Q27.Le gestionnaire du site veut mettre à l'honneur les meilleurs scores pour chaque jeu, ceci sur la page d'accueil du site. Écrire une requête SQL affichant chaque nom de jeu avec le meilleur score pour ce jeu.
ANNEXE 1 - Base de données d'un site de jeux
| id_client | nom | prenom | date_inscription | anniversaire | |
| 1 | 'Dupont' | 'Jean' | '[email protected]' | '15-01-2023' | '03-07' |
| 2 | 'Martin' | 'Sophie' | '[email protected]' | '22-05'2024' | '30-11' |
| 3 | 'Cruise' | 'Tom' | '[email protected]' | '22-05-2024' | '03-07' |
| … | … | … | … | … | … |
| id_jeu | nom_jeu | description | prix |
| 1 | 'Pac Man' | 'Mangez sans être mangé!' | 0.99 |
| 2 | 'Space Invaders' | 'Protégez la galaxie des envahisseurs' | 1.99 |
| ... | ... | ... | ... |
| id_facture | id_client | id_jeu | date_achat | montant |
| 1 | 1 | 1 | '15-06-2023' | 2.99 |
| 2 | 2 | 2 | '16-06-2023' | 1.99 |
| ⋯ | ... | ... | ... | ... |
| id_record | id_client | id_jeu | score | date_record |
| 1 | 1 | 1 | 1250 | '20-06-2024' |
| 2 | 327 | 8 | 2000 | '21-06-2025' |
| … | … | ... | … | ... |
ANNEXE 2 - Rappels de syntaxe Python
| Création d'un dictionnaire vide | dico = dict() | Complexité 0(1) |
| Nombre de clés d'un dictionnaire | len(dico) | Complexité 0(1) |
| Test d'appartenance d'une clé à un dictionnaire | x in dico | Complexité 0(1) |
| Création d'une liste vide |
|
Complexité 0(1) |
| Taille d'une liste | len(L) | Complexité 0(1) |
| Test d'appartenance à une liste | x in L | Complexité O(len(L)) |
| Ajouter un élément à la fin d'une liste |
|
Complexité 0 (1) |
| Supprimer et renvoyer le dernier élément d'une liste |
|
Complexité 0(1) |
| Affichage d'une variable x et retour à la ligne | print(x) | Complexité variable |
- Ce problème a été posé en 1848 par Max Bezzel pour un échiquier ordinaire, partiellement résolu par Carl Friedrich Gauss, puis complètement résolu par Franz Nauck en 1850.
Questions fréquentes
4 questionsSur quels chapitres porte le sujet d'informatique commune CCINP TSI 2026 sur le problème des n reines ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quels chapitres porte le sujet d'informatique commune CCINP TSI 2026 sur le problème des n reines ?
Il porte sur la manipulation de listes en Python, la complexité algorithmique, la génération de permutations, la récursivité et l'algorithme de retour sur trace, puis sur les bases de données relationnelles en SQL.
Les deux parties du sujet sont-elles indépendantes ?
Oui, le sujet comporte deux parties indépendantes, l'une sur le problème des n reines, l'autre sur une base de données de site de jeux en ligne.
Quelles méthodes sont utilisées pour résoudre le problème des n reines ?
Le sujet fait explorer successivement une recherche aléatoire par permutations, une recherche exhaustive par génération de toutes les permutations, puis un parcours de graphe récursif avec retour en arrière, plus efficace pour les grandes tailles de grille.
Quelles notions de bases de données sont mobilisées dans la partie II ?
L'écriture de requêtes SQL de sélection, de filtrage par date, de jointure entre plusieurs tables et de calcul de sommes ou de maximums par groupe, sur une base de données de clients, jeux, factures et records.
Pas de description pour le moment
