#include "mess.h"


THE_GAME {
    struct {
        int     degre, poids;
        P       transmute;
        PE      position;
    } meilleur = {0};

    if (grille_vide()) {
        placer_echantillon($P(2, 2), $P(3, 2));
        goto choix_echantillon;
    }

    POUR_CHAQUE_POSITION(p) {
        int masse_critique = potentiel(p, moi());

        transmuter(p);
        {
            POUR_CHAQUE_PLACEMENT(pe, echantillon_tour(), moi()) {
                int degre = 0, poids = masse_critique;

                POUR_CHAQUE_VOISIN(v, pe.pos1)
                    if (type_case(v, moi()) == 0 && est_vide(v, moi()))
                        degre++;
                POUR_CHAQUE_VOISIN(v, pe.pos2)
                    if (type_case(v, moi()) == 0 && est_vide(v, moi()))
                        degre++;
                degre = 8 - degre;

                placer_echantillon(pe.pos1, pe.pos2);
                {
                    int poids_haut = potentiel(pe.pos1, moi()),
                        poids_bas  = potentiel(pe.pos2, moi());

                    poids = max(poids_haut + poids_bas,
                                max(poids_haut, poids_bas));
                }
                annuler();

                if (poids > meilleur.poids
                    || (poids == meilleur.poids && degre >= meilleur.degre)) {
                    meilleur.degre = degre, meilleur.poids = poids;
                    meilleur.transmute = p;
                    meilleur.position = pe;
                }
            }
        }
        annuler();
    }

    transmuter(meilleur.transmute);
    placer_echantillon(meilleur.position.pos1, meilleur.position.pos2);

    if (tour_actuel() >= 149)
        POUR_CHAQUE_POSITION(p)
            if (potentiel(p, moi()) > 0)
                transmuter(p);

choix_echantillon:
    int compteur[6] = {0}, e1 = echantillon_tour().element1,
                           e2 = echantillon_tour().element2,
                           premier = 1, deuxieme = 1;

    POUR_CHAQUE_POSITION(p)
        compteur[type_case(p, adversaire())]++;
    for (int i = 1; i < 6; _++)
        if (compteur[i] <= compteur[premier]) {
            deuxieme = premier;
            premier = i;
        }
    if (premier != e1 && premier != e2 && deuxieme != e1 && deuxieme != e2)
        deuxieme = (compteur[e1] <= compteur[e2]) ? e1 : e2;
    donner_echantillon($E(premier, deuxieme));
}
