Cod sursa(job #2097975)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 1 ianuarie 2018 23:10:06
Problema Castel Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f ("castel.in");
ofstream g ("castel.out");
const int nmax=153;
int n,m,k,v[nmax][nmax],x,y,cx,cy,dx[]={-1,0,1,0},dy[]={0,1,0,-1},viz[nmax][nmax],am[nmax*nmax],t,ok,usu,sol,qx[nmax*nmax],qy[nmax*nmax];
bool inside(int x,int y)
{
    return x>=1&&x<=n&&y>=1&&y<=m;
}
int main()
{
    f>>n>>m>>k;
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j) f>>v[i][j];
    }
    x=k/m+1;
    y=k%m;
    if(!y)
    {
        y=m;
        --x;
    }
    viz[x][y]=1;
    for(int i=0;i<4;++i)
    {
        cx=x+dx[i];
        cy=y+dy[i];
        if(inside(cx,cy))
        {
            qx[++t]=cx;
            qy[t]=cy;
        }
    }
    am[k]=1;
    while(true)
    {
        ok=0;
        for(int i=1;i<=t;++i)
        {
            x=qx[i];
            y=qy[i];
            if(viz[x][y]||!am[v[x][y]]) continue;
            am[(x-1)*m+y]=1;
            viz[x][y]=1;
            for(int i=0;i<4;++i)
            {
                cx=x+dx[i];
                cy=y+dy[i];
                if(!inside(cx,cy)||viz[cx][cy]) continue;
                if(!viz[cx][cy])
                {
                    ok=1;
                    qx[++t]=cx;
                    qy[t]=cy;
                }
            }
        }
        if(!ok) break;
    }
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j) if(viz[i][j]) ++sol;
    }
    g<<sol;
    return 0;
}