Cod sursa(job #2347087)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 18 februarie 2019 13:33:39
Problema Castel Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("castel.in");
ofstream g("castel.out");
vector <int> v[25005];
int fr[22501],a[151][151],x,y,i,j,n,m,k,b[151][151],q[22501][2],S;
int dx[] = {0,-1,0,1,0} , dy[]={0,0,1,0,-1},X,Y;
void poz(int code,int &x,int &y){
     if(code%m==0){
        x=code/m;
        y=m;
    }
    else {
        x=code/m+1;
        y=code%m;
    }
}
int coada(int x, int y){
    int p=0,u=0;
    q[0][0]=x;
    q[0][1]=y;
    b[x][y]=1;
    while(p<=u){
        int l=q[p][0];
        int c=q[p][1];
        p++;
        for(int k=1;k<=4;k++){
            int ln=l+dx[k];
            int cn=c+dy[k];
            if(ln>=1&&ln<=n&&cn>=1&&cn<=m){
                if(fr[a[ln][cn]]==1&&b[ln][cn]==0){
                    q[++u][0]=ln;
                    q[u][1]=cn;
                    b[ln][cn]=2;
                    fr[(ln-1)*m+cn]=1;
                    int nr=v[(ln-1)*m+cn].size()-1;
                    while(nr>=0){
                        poz(v[(ln-1)*m+cn][nr],X,Y);
                        q[++u][0]=X;
                        q[u][1]=Y;
                        b[X][Y]=2;
                        fr[(X-1)*m+Y]=1;
                        nr--;
                    }
                }
                else if(fr[a[ln][cn]]==0&&b[ln][cn]==0){
                    b[ln][cn]=1;
                    v[a[ln][cn]].push_back((ln-1)*m+cn);
                }
            }
        }
    }
    return u+1;
}
int main()
{   f>>n>>m>>k;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            f>>a[i][j];
    poz(k,x,y);
    fr[k]=1;
    g<<coada(x,y);
    return 0;
}