PRÉSENTATION DE SUDOKUSC

Documents pareils
1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Le prototype de la fonction main()

Introduction au langage C

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License,

3IS - Système d'exploitation linux - Programmation système

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Introduction...3. Objectif...3. Manipulations...3. La Sauvegarde...4. Les différents types...4. Planification...4. Les outils...5

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Introduction...3. Objectif...3. Manipulations...3. Gestion des utilisateurs et des groupes...4. Introduction...4. Les fichiers de base...

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Guide pratique de CSPM, l'outil de suivi des performances du système Version française du Complete System Performance Monitor HOWTO

Testez votre installation. Créer un répertoire vide

Programmation système de commandes en C

Bases de programmation. Cours 5. Structurer les données

Programmation C++ (débutant)/instructions for, while et do...while

Annexe : La Programmation Informatique


INFO-F-404 : Techniques avancées de systèmes d exploitation

Programmation système I Les entrées/sorties

Les structures. Chapitre 3

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Compression de Données - Algorithme de Huffman Document de Conception

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Avant-propos. VERSION Compilation du document à l aide de PDFLATEX Philippe Charlier. 1 Version actuelle : SPIP http ://

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Le langage C. Séance n 4

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Comment Créer une Base de Données Ab Initio

Arguments d un programme

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Programmation C. Apprendre à développer des programmes simples dans le langage C

Programmation en langage C

Java Licence Professionnelle CISII,

Algorithmique et Programmation, IMA

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

Installation d'un TSE (Terminal Serveur Edition)

Mon premier rpm. 7 juin Avant de commencer RPM URPMI RPMBUILD... 2

Cours Programmation Système

Chap III : Les tableaux

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Cours 6 : Tubes anonymes et nommés

Les structures de données. Rajae El Ouazzani

I00 Éléments d architecture

I. Introduction aux fonctions : les fonctions standards

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Comment sauvegarder ses documents

Comment Utiliser les Versions, les Modification, les Comparaisons, Dans les Documents

Licence Sciences et Technologies Examen janvier 2010

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Découverte des Logiciels Libres. Gilles Dequen

Diffusion AFRISTAT. Quels droits accorder aux utilisateurs? - sur les données - sur les documents numériques

Insérer des images dans Base

Manuel d'exploitation de l'application Vitamin version 1.0

Programmation système en C/C++

Comment consolider des données

Déploiement OOo en environnement Windows Terminal Server

Utiliser un proxy sous linux

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Recherche dans un tableau

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Listes de validation dans OpenOffice Calc

Exercice sur les Dockers

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

V- Manipulations de nombres en binaire


La montée des bases de données open source

Comment faire des étiquettes

Création de Sous-Formulaires

OS Réseaux et Programmation Système - C5

Simulation : application au système bonus-malus en responsabilité civile automobile

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Comment faire un Mailing A partir d une feuille Calc

Logiciel Libre Cours 3 Fondements: Génie Logiciel

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Internationalisation d'une application Python

Langages et Concepts de Programmation Introduction à la programmation en langage C

Programmation C. J.-F. Lalande. 15 novembre 2012

Programmation en C - Sommaire

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Notes de Cours - Programmation Pascal Ferraro

Installation d'un serveur RADIUS

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Les Licences Libres Ouverture et Protection des Logiciels. Plan

UE C avancé cours 1: introduction et révisions

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Programmation Classique en langage C

DOCUMENTATION - FRANCAIS... 2

Gestion de la mémoire

Programmer en JAVA. par Tama

Piano Stairs. descriptif de la conception et des programmes associés. Copyright (C) 2013 taprik

Programme awk------introduction rapide

Génération de code binaire pour application multimedia : une approche au vol

Comment Accéder à des Bases de Données MySQL avec Windows lorqu'elles sont sur un Serveur Linux

OpenOffice.org Présentation - Débuter. Distribué par Le projet OpenOffice.org

Transcription:

PRÉSENTATION DE SUDOKUSC Comment réaliser un programme capable de compléter n'importe quelle grille de Sudoku? 5 3 7 6 1 9 5 9 8 6 8 6 3 4 8 3 1 7 2 6 6 2 8 4 1 9 5 8 7 9 - L'algorithme utilisé (la méthode) - Son implémentation dans un programme (la programmation) - Le résultat final (le programme) Copyright (c) 2006 AMARILLI Antoine. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

Choix d'une méthode Quels critères permettent de choisir la méthode de résolution à utiliser? - Simplicité (répétition d'une procédure simple) - Rigueur (l'ordinateur ne travaille pas au feeling) - Exhaustivité (pouvoir résoudre toutes les grilles) - Rapidité (aussi optimisé que possible) Image de Splintax sur Wikimedia Commons, licence GNU GFDL

L'algorithme de sudokusc (1) Début : résoudre une grille Trouver la première case vide Trouver les solutions valides pour cette case (celles qui n'apparaissent pas dans la même ligne, dans la même colonne ou dans le même carré Un algorithme récursif Pour chaque solution possible: Compléter avec cette solution NON Grille résolue? OUI Afficher la solution Fin

L'algorithme de sudokusc (2) Exploration de l'arbre 9 7 8 1 2 9 B C B=3 9 7 8 1 2 9 3 C Pas de solution pour C! On revient sur nos pas... A=1 9 7 8 A 2 9 B C A=2 9 7 8 2 2 9 B C B=1 B=3 9 7 8 2 2 9 1 C 9 7 8 2 2 9 3 C Pas de solution pour C! On revient encore sur nos pas... C=1 9 7 8 2 2 9 3 1 Terminé! La grille est complétée. Ici, on a été malchanceux : la solution était tout en bas de l'arbre (on aurait pu tomber dessus dès le début!)

La programmation #define G(n) int n(int t, int q, int d) #define X(p,t,s) (p>=t&&p<(t+s)&&(p- (t)&1023)<(s&1023)) #define U(m) *((signed char *)(m)) #define F if(!--q){ #define I(s) (int)main-(int)s #define P(s,c,k) for(h=0; h>>14==0; h+=129)y(16*c+h/1024+y(v+36)) &128>>(h&7)?U(s+(h&15367))=k: k G (B) { Z; F D = E (Y (V), C = E (Y (V), Y (t + 4) + 3, 4, 0), 2, 0); Y (t + 12) = Y (t + 20) = i; Y (t + 24) = 1; Y (t + 28) = t; Y (t + 16) = 442890; Y (t + 28) = d = E (Y (V), s = D * 8 + 1664, 1, 0); for (p = 0; j < s; j++, p++) U (d + j) = i == D j < p? p--, 0 : (n = U (C + 512 + i++)) < ' '? p = n * 56-497, 0 : n; } C'est quoi? - On rédige l'algorithme dans un langage de programmation - L'ordinateur traduit ce code en des instructions qu'il peut comprendre et exécuter

Les langages de programmation Quel langage choisir? INTERPRÉTÉ OU COMPILÉ? HAUT NIVEAU OU BAS NIVEAU? compilation (une fois) exécution (à chaque fois) CODE CODE BYTECODE EXÉCUTABLE compilateur interpréteur EXÉCUTABLE (compilé) BYTECODE (interprété) CODE (interprété) exécution exécution La compilation doit être refaite si l'on change de machine, mais l'interprétation peut ralentir l'exécution. Langue de l'homme Microsoft Visual Basic Java Python BASIC C++ C Assembleur À la plume d'oie... Langue de l'ordinateur - plus concis (en apparence) - plus naturel - plus indépendant de la machine - moins rapide - moins rigoureux - moins de possibilités - plus de possibilités - plus rigoureux - plus rapide - moins concis (toutefois...) - moins naturel - moins indépendant de la machine

Le langage C C quoi? - Bas niveau - Compilé - Très rapide - Très rigoureux mais permissif (attention!) - Normalisé ANSI et ISO - Vieux! (1972, normalisé en 89 et a évolué depuis) - Peu de concepts mis en oeuvre - Quelques «extensions» (C++, etc.) - Portable (si l'on fait attention à ce que l'on fait) - Déjà très utilisé C-...et en plus, je souhaitais l'apprendre...

Les pointeurs Mémoire vive de l'ordinateur Adresses Valeur...... 546023 15 546024 0 546025 546026-65 546027 0 546028 185...... Un concept inventé par le langage C. Mais qu'est-ce-que c'est? La mémoire vive d'un ordinateur est un ensemble d'adresses contenant chacune une valeur. Dans un programme, on utilise des variables pour stocker des données (par exemple, une grille de Sudoku est un tableau de 81 variables). Un pointeur est une variable contenant une adresse (ex : à l'adresse 546025, il y a l'adresse 546027). Pour optimiser sudokusc, on utilise les pointeurs. Par exemple, au lieu de stocker plein de grilles différentes alors que l'on parcourt l'arbre et que l'on essaie de résoudre (ce qui prend beaucoup de place dans la mémoire), on stocke une seule fois la grille et l'on donne aux différents appels du programme (à chaque essai) un pointeur vers la grille, plutôt qu'une copie de la grille.

Le programme #include <stdio.h> #include <stdlib.h> #include <tgmath.h> #include <string.h> #include <stdlib.h> #define DIM 3 int fill(int grid[dim*dim][dim*dim], int[2], int[dim*dim+1]); int firstempty(int[dim*dim][dim*dim], int[dim*dim*dim*dim][2], int *); int solve(int[dim*dim][dim*dim], int[dim*dim*dim*dim][2], int); int solution(int[dim*dim][dim*dim]); int main(int argc, char *argv[]) { int grid[dim*dim][dim*dim]; int empty[dim*dim*dim*dim][2]; int empties = 0; printf("please enter the grid you wish to solve \n"); printf("separate each digit by enter \n"); printf("enter 0 for empty squares \n"); int i, j, ret; for(i=0;i<dim*dim;i++) { for(j=0;j<dim*dim;j++) { scanf("%ld",&grid[i][j]); } printf("- - - - - - - - - \n"); } firstempty(grid, empty, (int *) &empties); if (empties) { solve(grid, empty, empties); }else{ solution(grid); } return 0; } int firstempty(int grid[dim*dim][dim*dim], int empty[dim*dim*dim*dim][2], int *empties) { int i, j; for(i=(dim*dim)-1;i>=0;i--) { for(j=(dim*dim)-1;j>=0;j--) { if (!grid[i][j]) { empty[*empties][0] = i; empty[*empties][1] = j; (*empties)++; } } } return 0; } int solve(int grid[dim*dim][dim*dim], int empty[dim*dim*dim*dim][2], int empties) { int i, ret; int fills[dim*dim+1] = {0}; empties--; fill(grid, (int *) empty[empties], (int *) &fills); for(i=1;i<dim*dim+1;i++) { if (!fills[i]) { grid[empty[empties][0]][empty[empties][1]] = i; if (!empties) { solution(grid); } else { solve(grid, empty, (int) empties); } } } grid[empty[empties][0]][empty[empties][1]] = 0; return 0; } int solution(int grid[dim*dim][dim*dim]) { int i, j, k; for(i=0;i<dim*dim;i++) { for (k=0;k<dim*dim;k++) { printf("+-"); } printf("+\n"); for(j=0;j<dim*dim;j++) { printf(" %d",grid[i][j]); } printf(" \n"); } for(k=0;k<dim*dim;k++) { printf("+-"); } printf("+\n\n"); return 0; } int fill(int grid[dim*dim][dim*dim], int cell[2], int ret[dim*dim+1]) { int k = 0; for(k=0;k<dim*dim;k++) { ret[grid[cell[0]][k]] = 1; ret[grid[k][cell[1]]] = 1; ret[grid[(cell[0]/dim)*dim+k/dim][(cell[1]/dim)*dim+k%di M]] = 1; } return 0; } Quel résultat au final? - Environ 280 lignes - 800 mots - 6000 caractères (court!) - Environ 2000 caractères pour la version courte, à gauche (pas de commentaires ni d'espacement) - A résolu tous les Sudoku testés - Temps de résolution : environ 1-2 millisecondes sur ma machine (!!) - Interface terminal, peu conviviale - Peut résoudre les Sudoku de dimension n - Logiciel libre sous GPL

Mais pourquoi il a fait ça? C'est vrai, ça sert à quoi, son truc? Image de David Vignoni, licence GNU LGPL - Pour apprendre le C - Pour voir si j'en étais capable - Au cas où ça n'existait pas encore... - Pour m'occuper - Pour m'amuser, aussi (sisi, ça m'amuse) - Pour ricaner quand je vois quelqu'un en difficulté devant un Sudoku - Pour réfléchir un peu - Pour résoudre le cas général - Au cas où ça viendrait un jour à servir à quelque chose - Pour le bien de notre civilisation - Inutile donc indispensable! -... Il vaut mieux pomper même s'il ne se passe rien que risquer qu'il se passe quelque chose de pire en ne pompant pas Devise Shadok