Cod sursa(job #84058)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 13 septembrie 2007 12:14:13
Problema Castel Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <stdio.h>
#define lMax 23000

long n,m,i,j,k,c,a[151][151];
long p,q,x[lMax],y[lMax],xx,yy;
long dx[]={0,-1,0,1,0};
long dy[]={0,0,1,0,-1};
bool v[151][151],f[151][151],chei[lMax];

int main(){
    freopen ("castel.in","r",stdin);
    freopen ("castel.out","w",stdout);
    
    scanf ("%ld %ld %ld",&n,&m,&p);
    for (i=1;i<=n;i++){
        for (j=1;j<=m;j++){
            scanf ("%ld",&a[i][j]);
        }
    }
    
    chei[p]=1;
    x[1]=p/m;
    y[1]=p%m;
    if (!y[1])y[1]=m;
    else x[1]++;
    
    p=1;
    q=1;
    while (p<=q){
          for (k=1;k<=4;k++){
              xx=x[p]+dx[k];
              yy=y[p]+dy[k];
              if (1<=xx&&xx<=n&&1<=yy&&yy<=m)
                 if (!v[xx][yy])
                    if (chei[a[xx][yy]]){
                       v[xx][yy]=1;
                       chei[(xx-1)*m+yy]=1;
                       q++;
                       x[q]=xx;
                       y[q]=yy;
                       for (i=1;i<=4;i++)
                           if (!v[xx+dx[i]][yy+dy[i]])
                              f[xx+dx[i]][yy+dy[i]]=1;
                    } 
          }
          for (i=1;i<=n;i++)
              for (j=1;j<=m;j++)
                  if (f[i][j])
                     if (chei[a[i][j]]){
                        v[i][j]=1;
                        f[i][j]=0;
                        chei[(i-1)*m+j]=1;
                        q++;
                        x[q]=i;
                        y[q]=j;
                        for (k=1;k<=4;k++)
                            if (!v[i+dx[k]][j+dy[k]])
                               f[i+dx[k]][j+dy[k]]=1;
                     }
          p++;
    }
    c=0;
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
            if (v[i][j])c++;
    printf("%ld\n",c);
    
    return 0;
}