Tableaux à deux dimensions#

Motivation : Le jeu de morpion#

On voudrait modéliser le plateau d’un jeu de morpion :

XO
XXX
OO

C’est comme un tableau, mais à deux dimensions: numéro de ligne, numéro de colonne

012
0XO
1XXX
2 OO

Comment modéliser un plateau de morpion en C++?#

  • modéliser une case : un entier : int

    • 0 : pas de pion

    • 1 : pion joueur 1 : X

    • 2 : pion joueur 2 : O

  • modéliser une ligne : un tableau d’entiers : vector<int>

#include <vector>
using namespace std;
012
0XO
vector<int> ligne0 = { 1, 2, 0 };
012
1XXX
vector<int> ligne1 = { 1, 1, 1 };
012
2 OO
vector<int> ligne2 = { 0, 2, 2 };
  • modéliser le plateau : un tableau de tableaux : vector<vector<int>>

vector<vector<int>> plateau = { ligne0, ligne1, ligne2 };

En version courte :

vector<vector<int>> plateau = {
    { 1, 2, 0 },
    { 1, 1, 1 },
    { 0, 2, 2 },
};

Utilisation du tableau de Morpion#

#include <iostream>

Accès par indices de ligne et de colonne :

for ( int i = 0; i < plateau.size(); i++ ) {
    for ( int j = 0; j < plateau[i].size(); j++ ) {
        if      ( plateau[i][j] == 1 ) cout << "X ";
        else if ( plateau[i][j] == 2 ) cout << "O ";
        else                           cout << "  ";
    }
    cout << endl;
}

Avec une boucle «pour tout» :

for ( auto ligne: plateau ) {
    for ( auto c: ligne ) {
        if      ( c == 1 ) cout << "X ";
        else if ( c == 2 ) cout << "O ";
        else               cout << "  ";
    }
    cout << endl;
}

Construction d’un tableau à deux dimensions#

#include <vector>
using namespace std;

En une seule étape :

vector<vector<int>> plateau = {
    { 1, 2, 0 },
    { 1, 1, 1 },
    { 0, 2, 2 },
};

Construction d’un tableau étape par étape :

  • Déclaration :

vector<vector<int>> plateau;
  • Allocation :

plateau = vector<vector<int>>(3);
  • Allocation des sous-tableaux :

for ( int i = 0; i < plateau.size(); i++ )
    plateau[i] = vector<int>(3);
  • Initialisation :

plateau[0][0] = 1; plateau[0][1] = 2; plateau[0][2] = 0;
plateau[1][0] = 1; plateau[1][1] = 1; plateau[1][2] = 1;
plateau[2][0] = 0; plateau[2][1] = 2; plateau[2][2] = 2;

Que se passe-t’il en mémoire?#

  1. État initial

    ../../_images/pile-tas-etat-initial2.png
  1. Déclaration du tableau

    ../../_images/pile-tas-declaration2.png
  1. Allocation du tableau

    ../../_images/pile-tas-allocation2.png
  1. Allocation des sous-tableaux

    ../../_images/pile-tas-allocation-sous-tableaux.png
  1. Initialisation

    ../../_images/pile-tas-initialisation.png

Tableaux à deux dimensions : résumé#

  • On modélise un tableau à deux dimensions par un tableau de tableaux : vector<vector<...>>

  • t[i][j]: la case \(t_{i,j}\) du tableau d’indice de ligne \(i\) et d’indice de colonne \(j\).

  • Un tableau à deux dimension se construit en quatre étapes :

    1. Déclaration du tableau

    2. Allocation du tableau

    3. Allocation des sous-tableaux

    4. Initialisation