blackgoddess vive le troll ! |
voila un essai :
Code :
- template<bool cond, typename true_part, typename false_part>
- struct IF
- {
- typedef true_part type;
- };
- template<typename true_part, typename false_part>
- struct IF<false, true_part, false_part>
- {
- typedef false_part type;
- };
- template<size_t x, size_t y, size_t to_add>
- struct remplir_dernier
- {
- template<size_t X>
- static void exec(int tab[X][X])
- {
- tab[to_add+x][to_add+y] = 0;
- }
- };
- template<size_t taille, size_t pos_x, size_t compteur, size_t to_add>
- struct remplir_haut
- {
- template<size_t X>
- static void exec(int tab[X][X])
- {
- tab[to_add+pos_x][to_add] = compteur;
- IF<pos_x == taille-1,
- remplir_droite<taille, 1, compteur+1, to_add>,
- remplir_haut<taille, pos_x+1, compteur+1, to_add>
- >::type::exec<X>(tab);
- }
- };
- template<size_t taille, size_t pos_y, size_t compteur, size_t to_add>
- struct remplir_droite
- {
- template<size_t X>
- static void exec(int tab[X][X])
- {
- tab[to_add+taille-1][to_add+pos_y] = compteur;
- IF<pos_y == taille-1,
- remplir_bas<taille, taille-2, compteur+1, to_add>,
- remplir_droite<taille, pos_y+1, compteur+1, to_add>
- >::type::exec<X>(tab);
- }
- };
- template<size_t taille, size_t pos_x, size_t compteur, size_t to_add>
- struct remplir_bas
- {
- template<size_t X>
- static void exec(int tab[X][X])
- {
- tab[to_add+pos_x][to_add+taille-1] = compteur;
- IF<pos_x == 0,
- IF<taille == 2,
- remplir_dernier<0, 1, to_add>,
- remplir_gauche<taille, taille-2, compteur+1, to_add>
- >::type,
- remplir_bas<taille, pos_x-1, compteur+1, to_add>
- >::type::exec<X>(tab);
- }
- };
- template<size_t taille, size_t pos_y, size_t compteur, size_t to_add>
- struct remplir_gauche
- {
- template<size_t X>
- static void exec(int tab[X][X])
- {
- tab[to_add][to_add+pos_y] = compteur;
- IF<pos_y == 1,
- IF<taille == 3,
- remplir_dernier<to_add+1, 0, 0>,
- remplir_haut<taille-2, 0, compteur+1, to_add+1>
- >::type,
- remplir_gauche<taille, pos_y-1, compteur+1, to_add>
- >::type::exec<X>(tab);
- }
- };
- #include <iostream>
- #include <iomanip>
- const size_t tab_taille = 5;
- int tab[tab_taille][tab_taille];
- int main()
- {
- remplir_haut<tab_taille, 0, 1, 0>::exec<tab_taille>(tab);
- //std::cout.fill('0');
- for(size_t i = 0; i<tab_taille; i++)
- {
- for(size_t j=0; j<tab_taille; j++)
- std::cout << std::setw(2) << std::right << tab[j][i] << ' ';
- std::cout << '\n';
- }
- std::cin.ignore();
- }
|
---------------
-( BlackGoddess )-
|