Ben, ca n'a rien de vraiment compliqué...
C'est juste logique, et on va donc réexpliquer;)
Quand tu déclare un tableau tab[linge][colone], c'est un tableau qui fait linge*colone éléments
Quand tu passe à la première colone de la deuxième ligne, c'est, normalement que tu a déjà parcouru la première ligne, et tu te trouve donc au "colone"ieme+1 élément...
Comme les index commencent à 0 en C et en C++, la première ligne et la première colone ont l'index 0, et donc le premier élément que l'on trouve à la ligne 1 (la deuxième) est en fait l'élément qui se trouve à l'index ... colone ;)
On *pourrait* envisager d'inverser la place de l'index des ligne et des colones dans le calcul, mais, l'idée de base est d'utiliser la même convention que ce qui se fait pour la gestion des matrices en mathématiques: M(ligne, colone)
Si donc tu applique le calcul numéro_ligne * nombre_element_par_colone + numéro_colone, la priorité de la multiplication sur l'addition fait que le calcul tombe juste parce que cela revient à (calculer numéro_ligne* nombre_element_par_colone) + numéro_colone :D
Tu vois, y a rien de tellement compliqué à tout cela ;)