Cod sursa(job #1167217)

Utilizator YoChinezuWeng Mihai Alexandru YoChinezu Data 4 aprilie 2014 17:02:53
Problema Castel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <cstdio>
#include <queue>
#include <set>
#include <bitset>

using namespace std;

queue <int> Q;
set <int> v[22505];
int a[155][155],cc,ll;
int dx[]= {-1,0,1,0},
          dy[]= {0,1,0,-1};
bitset <22505> f;

inline int conv1(int l,int c,int m) {
    return (l-1)*m+c;
}

inline void conv2(int k,int n,int m) {
    ll=k/m;
    if(k%m==0) {
        cc=m;
        return ;
    }
    ll=k/m+1;
    cc=k%m;
}

int main() {
    freopen("castel.in","r",stdin);
    freopen("castel.out","w",stdout);

    int n,m,k,aux,new_x,new_y,l,c,Size,temp;
    scanf("%d%d%d",&n,&m,&k);

    for(int i=1; i<=n; ++i) {
        for(int j=1; j<=m; ++j) {
            scanf("%d",&a[i][j]);
        }
    }

    Q.push(k);

    while(!Q.empty()) {
        aux=Q.front();
        conv2(aux,n,m);
        f[aux]=1;
        for(int i=0; i<4; ++i) {
            new_x=dx[i]+ll;
            new_y=dy[i]+cc;
            if(a[new_x][new_y]!=0 && f[conv1(new_x, new_y, m)] == 0) {
                if(v[aux].size()!=0) {
                    Size=v[aux].size();
                    for(int j=0; j<Size; ++j) {
                        Q.push(a[aux][j]);
                        v[aux].erase(a[aux][j]);
                    }
                }
                temp=conv1(new_x,new_y,m);
                if(f[a[new_x][new_y]]==1) {
                    Q.push(temp);
                    f[temp]=1;
                } else {
                    v[a[new_x][new_y]].insert(temp);
                }
            }
        }

        Q.pop();
    }

    printf("%d",f.count());

    return 0;
}