[ create a new paste ] login | about

Link: http://codepad.org/vx992jYQ    [ raw code | output | fork ]

C++, pasted on Jan 7:
#include <cstdio>

// On joue sur le fait qu'une ligne (15 pixels) peut être représenté (en
// pratique) par un unsigned short, l'application du pinceau revenant à
// effectuer quelques xor.

// L'algo est assez simple (et assez exponentiel aussi, snif), on génere
// toutes les premieres lignes possibles à partir des quelles on peut en
// déduire la suite de l'image.

const unsigned short maxy=100;

int main(){
    unsigned short n, m;
    std::scanf("%hu %hu\n", &n, &m);

    unsigned short pic[maxy]={0};

    for(unsigned short i=0; i<n; ++i)
        for(unsigned short j=0; j<m; ++j){
            // Le non formaté, c'est rapide :
            pic[i] |= (std::getchar() -'0')<<j;
            std::getchar();
        }

    // rm: le masque, il va permettre de supprimer les modifications hors
    // image qui entraineraient des flips de pixels en trop sur le bord droit.
    unsigned short rm = (1U<<m)-1;

    // On genere d'abbord ce que chaque application sur la premiere ligne engendre sur
    // la derniere en supposant que l'image soit toute blanche.
    unsigned short impl[15];
    for(unsigned short i=0; i<m; ++i){
        impl[i]=1<<i;
        unsigned next=impl[i];
        impl[i]^=impl[i]<<1&rm^impl[i]>>1;
        for(unsigned short j=1; j<n; ++j){
            unsigned tmp=impl[i];
            impl[i]^=next^impl[i]<<1&rm^impl[i]>>1;
            next=tmp;
        }
    }

    // Qu'obtient t'on sur la derniere ligne si on ne fait aucune application sur la premiere.
    unsigned res=0;
    unsigned next=0;
    for(unsigned short k=1; k<n; ++k){
        unsigned short dif = pic[k-1]^res;
        res = next^dif^dif<<1&rm^dif>>1;
        next = dif;
    }

    // On essaye toutes les modifications possibles sur la premiere ligne, une
    // modification étant un unsigned short, il suffit de jouer sur la
    // représentation de ceux ci.
    for(unsigned short i=0; i<1U<<m; ++i){
        unsigned short fin=res;
        for(unsigned short j=0; j<m; ++j)
            if(i>>j&1)
                fin^=impl[j];

        if(fin==pic[n-1]){
            std::putchar('1');
            std::putchar('\n');
            return 0;
        }
    }

    std::putchar('0');
    std::putchar('\n');
}


Output:
1
Timeout


Create a new paste based on this one


Comments: