Cod sursa(job #1551397)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 15 decembrie 2015 20:21:18
Problema Castel Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <cstdio>
#define MAXN 150
#define MAXM MAXN*MAXN
#define NRDIR 4
int dl[NRDIR]={-1, 0, 1, 0}, dc[NRDIR]={0, 1, 0, -1};
int a[MAXM+1], b[MAXM+1], next[MAXM+1], lista[MAXN+1][MAXN+1], l[MAXN*MAXN], c[MAXN*MAXN], viz[MAXN+2][MAXN+2], m;
inline void adauga(int x, int y, int l, int c){
    m++;
    a[m]=l;
    b[m]=c;
    next[m]=lista[x][y];
    lista[x][y]=m;
}
int main(){
    int ans, k, i, j, p, nrlin, nrcol, x, t, f;
    FILE *fin, *fout;
    fin=fopen("castel.in", "r");
    fout=fopen("castel.out", "w");
    fscanf(fin, "%d%d%d", &nrlin, &nrcol, &k);
    for(i=1; i<=nrlin; i++){
        for(j=1; j<=nrcol; j++){
            fscanf(fin, "%d", &x);
            adauga((x-1)/nrcol+1, (x-1)%nrcol+1, i, j);
        }
    }
    for(i=0; i<=nrlin+1; i++){
        viz[i][0]=viz[i][nrcol+1]=3;
    }
    for(i=0; i<=nrcol+1; i++){
        viz[0][i]=viz[nrlin+1][i]=3;
    }
    l[0]=(k-1)/nrcol+1;
    c[0]=(k-1)%nrcol+1;
    viz[l[0]][c[0]]=2;
    ans=1;
    k=1;
    i=0;
    while(i<k){
        p=lista[l[i]][c[i]];
        while(p){
            if(viz[a[p]][b[p]]==0){
                viz[a[p]][b[p]]=1;
                f=0;
                for(t=0; t<NRDIR; t++){
                    f|=(viz[a[p]+dl[t]][b[p]+dc[t]]==2);
                }
                if(f){
                    l[k]=a[p];
                    c[k]=b[p];
                    viz[a[p]][b[p]]=2;
                    ans++;
                    k++;
                }
            }
            p=next[p];
        }
        i++;
    }
    fprintf(fout, "%d\n", ans);
    fclose(fin);
    fclose(fout);
    return 0;
}