Cod sursa(job #1221047)

Utilizator bogdanboboc97Bogdan Boboc bogdanboboc97 Data 19 august 2014 12:34:14
Problema Castel Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
#define M 152

using namespace std;

const char f[]="castel.in";
const char g[]="castel.out";

int a[M][M],b[M][M],i,j,n,m,p,p1,p2,v[M],q,nr,cc[M];
int x[]={0,0,1,0,-1};
int y[]={0,-1,0,1,0};
struct abc{
    int l,c;
}r[M*M];
bool z[M][M];

void bfs(int i,int j);

void searchkey(int x)
{
    cc[b[i][j]]=0;
    for(int t=0;t<q;t++)
    if(a[r[t].l][r[t].c]==x)
    bfs(r[t].l,r[t].c);
}

void bfs(int i,int j)
{
    v[b[i][j]]=1;
    if(z[i][j]==false)nr++,z[i][j]=true;
    if(cc[b[i][j]]==1)searchkey(b[i][j]);
    for(int k=1;k<=4;k++)
    if(i+x[k]<=n && i+x[k]>0 && j+y[k]<=m && j+y[k]>0 && z[i+x[k]][j+y[k]]==false && v[a[i+x[k]][j+y[k]]])bfs(i+x[k],j+y[k]);
    else if(i+x[k]<=n && i+x[k]>0 && j+y[k]<=m && j+y[k]>0 && z[i+x[k]][j+y[k]]==false && !v[a[i+x[k]][j+y[k]]])
        r[q].l=i+x[k],
        r[q].c=j+y[k],
        cc[a[r[q].l][r[q].c]]=1,
        q++;
}

int main(void)
{
    freopen(f,"r",stdin);
    freopen(g,"w",stdout);
    scanf("%d%d%d",&n,&m,&p);
    for(i=q=1;i<=n;i++)
    for(j=1;j<=m;j++,q++)
    {
        scanf("%d",&a[i][j]);
        b[i][j]=q;
        if(q==p)p1=i,p2=j;
    }
    q=0;
    bfs(p1,p2);
    printf("%d",nr);
    return 0;
}