Cod sursa(job #1142292)

Utilizator bobbychivescuChivescu Bogdan-Andrei bobbychivescu Data 13 martie 2014 18:13:02
Problema Castel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.51 kb
#include <cstdio>
#define nmax 10001
using namespace std;
int n, m, k, a[152][152], nr;
bool uz[22500];
struct poz {
    unsigned char c, l;
}b[22500];
struct nev{
    short n;
    unsigned char c[22500], l[22500];
}c[22500];//au nevoie de cheia i si se afla in poz c si l
int main()
{
    freopen("castel.in", "r", stdin);
    scanf("%d%d%d", &m, &n, &k);
    short i, j;
    for(i=1; i<=m; i++)
        for(j=1; j<=n; j++)scanf("%d", &a[i][j]);
    fclose(stdin);
    b[0].c=k%n;
    if(b[0].c==0){b[0].c=n; b[0].l=k/n;}
    else b[0].l=k/n+1;
    a[b[0].l][b[0].c]=0;
    uz[k]=1;
    short prim=0, ultim=0;
    while(prim<=ultim){


        nr++;


        for(i=1; i<=c[(b[prim].l-1)*n+b[prim].c].n; i++){
            ultim++;
            b[ultim].l=c[(b[prim].l-1)*n+b[prim].c].l[i];
            b[ultim].c=c[(b[prim].l-1)*n+b[prim].c].c[i];
            a[b[ultim].l][b[ultim].c]=0;
            uz[(b[ultim].l-1)*n+b[ultim].c]=1;
        }
        if(a[b[prim].l-1][b[prim].c])
            if(uz[a[b[prim].l-1][b[prim].c]]){
                ultim++;
                b[ultim].l=b[prim].l-1;
                b[ultim].c=b[prim].c;
                a[b[ultim].l][b[ultim].c]=0;
                uz[(b[ultim].l-1)*n+b[ultim].c]=1;
            }
            else{
                c[a[b[prim].l-1][b[prim].c]].n++;
                a[b[prim].l-1][b[prim].c]=0;
                c[a[b[prim].l-1][b[prim].c]].c[c[a[b[prim].l-1][b[prim].c]].n]=b[prim].c;
                c[a[b[prim].l-1][b[prim].c]].l[c[a[b[prim].l-1][b[prim].c]].n]=b[prim].l-1;
            }
        if(a[b[prim].l+1][b[prim].c])
            if(uz[a[b[prim].l+1][b[prim].c]]){
                ultim++;
                b[ultim].l=b[prim].l+1;
                b[ultim].c=b[prim].c;
                a[b[ultim].l][b[ultim].c]=0;
                uz[(b[ultim].l-1)*n+b[ultim].c]=1;
            }
            else{
                c[a[b[prim].l+1][b[prim].c]].n++;
                a[b[prim].l+1][b[prim].c]=0;
                c[a[b[prim].l+1][b[prim].c]].c[c[a[b[prim].l+1][b[prim].c]].n]=b[prim].c;
                c[a[b[prim].l+1][b[prim].c]].l[c[a[b[prim].l+1][b[prim].c]].n]=b[prim].l+1;
            }
        if(a[b[prim].l][b[prim].c+1])
            if(uz[a[b[prim].l][b[prim].c+1]]){
                ultim++;
                b[ultim].l=b[prim].l;
                b[ultim].c=b[prim].c+1;
                a[b[ultim].l][b[ultim].c]=0;
                uz[(b[ultim].l-1)*n+b[ultim].c]=1;
            }
            else{
                c[a[b[prim].l][b[prim].c+1]].n++;
                a[b[prim].l][b[prim].c+1]=0;
                c[a[b[prim].l][b[prim].c+1]].c[c[a[b[prim].l][b[prim].c+1]].n]=b[prim].c+1;
                c[a[b[prim].l][b[prim].c+1]].l[c[a[b[prim].l][b[prim].c+1]].n]=b[prim].l;
            }
        if(a[b[prim].l][b[prim].c-1])
            if(uz[a[b[prim].l][b[prim].c-1]]){
                ultim++;
                b[ultim].l=b[prim].l;
                b[ultim].c=b[prim].c-1;
                a[b[ultim].l][b[ultim].c]=0;
                uz[(b[ultim].l-1)*n+b[ultim].c]=1;
            }
            else{
                c[a[b[prim].l][b[prim].c-1]].n++;
                a[b[prim].l][b[prim].c-1]=0;
                c[a[b[prim].l][b[prim].c-1]].c[c[a[b[prim].l][b[prim].c-1]].n]=b[prim].c-1;
                c[a[b[prim].l][b[prim].c-1]].l[c[a[b[prim].l][b[prim].c-1]].n]=b[prim].l;
            }
            prim++;
    }
    freopen("castel.out", "w", stdout);
    printf("%d", nr);
    fclose(stdin);
    return 0;
}