Cod sursa(job #2579857)

Utilizator CybotStancila Ionut-Marian Cybot Data 12 martie 2020 21:57:53
Problema Castel Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("castel.in");
ofstream g("castel.out");

int n, m, k;
int dx[]={-1, 0, 1, 0};
int dy[]={0, 1, 0, -1};
bool viz[155][155]; /// pe unde a fost
bool key[155*155]; /// cheile pe care le are
struct Castel{
    int cheie; ///cheie necesara pt a intra in camera
    int cam; /// nrul camerei
}a[155][155];

deque <pair< int, int > > q; ///Camere Prin Care Se Poate Trece
deque <pair< int, int > > CamereRamase; ///pe aici ar putea trece
int camviz;

bool inside(int x, int y)
{ return x>=1 && x<=n && y>=1 && y<=m;
}

void lee()
{ camviz++;
  bool ok=true;
  int lc, cc, ln, cn;
  do {
        ok = true;

        for(int st = 0; st < camviz; st++) {
            lc = q[st].first;
            cc = q[st].second;
            for(int k = 0; k < 4; k++) {
                ln = lc + dx[k];
                cn = cc + dy[k];
                if(key[a[ln][cn].cheie]==1 && !viz[ln][cn] && inside(ln, cn)==1) {
                    ok = false;
                    key[a[ln][cn].cam] = true;
                    q[camviz++] = {ln, cn};
                    viz[ln][cn] = true;
                }
            }
        }
    } while(!ok);
}

int main()
{
    f>>n>>m>>k;
    int nrcam=0;
    for (int i=1;i<=n;i++)
    { for (int j=1;j<=m;j++)
      { f>>a[i][j].cheie;
        a[i][j].cam=++nrcam;
        if (nrcam==k)
        { viz[i][j]=1;
          key[nrcam]=1;
          q.push_front(make_pair(i, j));
        }
      }
    }
    lee();
    g<<camviz<<'\n';
    return 0;
}