Cod sursa(job #2718721)

Utilizator stefanvoicaVoica Stefan stefanvoica Data 9 martie 2021 08:22:54
Problema Castel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <bits/stdc++.h>
#define dim 152
using namespace std;
ifstream fin ("castel.in");
ofstream fout("castel.out");

struct el
{
    int x,y;
}necesar[dim][dim],coada[dim*dim+1];;

vector<el> lista[dim][dim];
int n,m,dx[]= {0,-1,0,1},dy[]= {-1,0,1,0};
bool viz[dim][dim],key[dim][dim];


void lee (int xi,int yi)
{
    viz[xi][yi]=1;
    key[xi][yi]=1;
    int p=1,u=1;
    coada[1].x=xi,coada[1].y=yi;

    while (p<=u)
    {
        int xx=coada[p].x,yy=coada[p].y;
        for (int j=0;j<lista[xx][yy].size();j++)
            if (viz[lista[xx][yy][j].x][lista[xx][yy][j].y]==0)
            {
                coada[++u].x=lista[xx][yy][j].x;
                coada[u].y=lista[xx][yy][j].y;
                viz[coada[u].x][coada[u].y]=1;
                key[coada[u].x][coada[u].y]=1;
            }
            lista[xx][yy].clear();
        for (int i=0;i<4;i++)
        {
        int xx=coada[p].x+dx[i],yy=coada[p].y+dy[i];
        if (xx>0 && xx<=n && yy>0 && yy<=m&&viz[xx][yy]==0 && key[necesar[xx][yy].x][necesar[xx][yy].y]==1)
        {
            coada[++u].x=xx;
            coada[u].y=yy;
            viz[xx][yy]=1;
            key[xx][yy]=1;
        }
        else    if (xx>0 && xx<=n && yy>0 && yy<=m&&viz[xx][yy]==0)
                lista[necesar[xx][yy].x][necesar[xx][yy].y].push_back({xx,yy});
        }
        ++p;
    }
}

int32_t main()
{
    int i,j,k,cod,xi,yi,sol=0;
    fin>>n>>m>>cod;
    xi=cod/m;
    if (cod%m!=0)
        xi++;
    yi=cod-(xi-1)*m;
    for (i=1; i<=n; i++)
        for (j=1; j<=m; j++)
            {
                fin>>cod;
                necesar[i][j].x=cod/m;
                if (cod%m!=0)
                    necesar[i][j].x++;
                necesar[i][j].y=cod-(necesar[i][j].x-1)*m;
            }
    lee(xi,yi);
    for (i=1; i<=n; i++)
        for (j=1; j<=m; j++)
            if (viz[i][j]==1)
            ++sol;
    fout<<sol<<'\n';
    return 0;
}