Cod sursa(job #1161671)

Utilizator gabib97Gabriel Boroghina gabib97 Data 31 martie 2014 13:16:30
Problema Castel Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int n,m,k,i,j,a[151][151],t[22600],*x[22600],*y[22600],xi,yi,dx[]={0,0,1,-1},dy[]={1,-1,0,0},o[22600],p,u,c[2][100000],pi,nr;
bool b[151][151];
int ok(int x,int y)
{
    if (b[x+1][y]) return 3;
    if (b[x-1][y]) return 2;
    if (b[x][y-1]) return 0;
    if (b[x][y+1]) return 1;
    return -1;
}
void lee()
{
    int i,j,in,jn,k,d,l,aux;
    b[xi][yi]=1;
    o[a[xi][yi]]=1;
    p=1; u=1;
    c[0][p]=xi; c[1][p]=yi;
    while (p<=u)
    {
        i=c[0][p]; j=c[1][p];
        for (k=0;k<4;k++)
        {
            in=i+dx[k];
            jn=j+dy[k];
            if (in>0&&jn>0&&in<=n&&jn<=m&&b[in][jn]==0&&o[a[in][jn]])
            {
                u++;
                c[0][u]=in;
                c[1][u]=jn;
                b[in][jn]=1;
                d=(in-1)*m+jn;
                o[d]=1;
                for (l=1;l<=t[d];l++)
                    if (ok(x[d][l],y[d][l])>=0)
                {
                    aux=ok(x[d][l],y[d][l]);
                    u++;
                    c[0][u]=x[d][l]+dx[aux];
                    c[1][u]=y[d][l]+dy[aux];
                }
            }
        }
        p++;
    }
}
int main()
{
    freopen ("castel.in","r",stdin);
    freopen ("castel.out","w",stdout);
    scanf("%i%i%i",&n,&m,&pi);
    for (i=1;i<=n*m;i++)
    {
        x[i]=(int*) calloc(1,sizeof(int));
        y[i]=(int*) calloc(1,sizeof(int));
    }
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
        {
            scanf("%i",&a[i][j]);
            t[a[i][j]]++;
            x[a[i][j]][t[a[i][j]]]=i;
            y[a[i][j]][t[a[i][j]]]=j;
        }
    xi=(pi-1)/m+1; yi=pi-(xi-1)*m;
    lee();
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++) nr+=b[i][j];
    printf("%i",nr);
    fclose(stdin);
    fclose(stdout);
    return 0;
}