Cod sursa(job #2562472)

Utilizator levladiatorDragutoiu Vlad-Ioan levladiator Data 29 februarie 2020 14:44:49
Problema Castel Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("castel.in");
ofstream fout("castel.out");

vector  < int >  cdx,cdy;
vector <int> cx[155*155],cy[155*155];

int n,m,rasp,v[155][155],k,p,u,x,y,nr[155][155],p2,u2;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
bool acces[155*155],verif[155][155];

void bordare()
{
    for(int i=0;i<=n+1;i++)
        verif[i][0]=verif[i][m+1]=1;

    for(int i=0;i<=m+1;i++)
        verif[0][i]=verif[n+1][i]=1;
}
void citire()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            fin>>v[i][j];
            cx[v[i][j]].push_back(i);
            cy[v[i][j]].push_back(j);
            nr[i][j]=(i-1)*m+j;
        }
    }
}
int main()
{
    fin>>n>>m>>k;
    citire();
    bordare();
    if(k%m==0)cdx.push_back(k/m);
    else cdx.push_back(k/m+1);
    if(k%m==0)cdy.push_back(m);
    else cdy.push_back(k%m);
    x=cdx[u];
    y=cdy[u];
    acces[nr[x][y]]=1;
    verif[x][y]=1;
    while(p<=u)
    {
        x=cdx[p];
        y=cdy[p];
        for(int i=0;i<4;i++)
        {
            int xf=x+dx[i];
            int yf=y+dy[i];
            if(acces[v[xf][yf]]==1&&verif[xf][yf]==0)
            {
                u++;
                cdx.push_back(xf);
                cdy.push_back(yf);
                acces[nr[xf][yf]]=1;
                verif[xf][yf]=1;

            }
        }
        for(int j=0;j<cx[nr[x][y]].size();j++)///parcurgem toate elem cu cheia nr
            {
                int x2=cx[nr[x][y]][j];
                int y2=cy[nr[x][y]][j];
                if(verif[x2][y2]==0)
                {
                    for(k=0;k<4;k++) ///vedem daca are vecin accesibil
                    {
                        int x3=x2+dx[k];
                        int y3=y2+dy[k];
                        if(verif[x3][y3]==1) ///daca are, il bagam in coada
                        {
                            u++;
                            cdx.push_back(x2);
                            cdy.push_back(y2);
                            verif[x2][y2]=1;
                            acces[nr[x2][y2]]=1;
                            break;
                        }

                    }
                }
            }
        p++;
    }
    fout<<u+1;
}