Cod sursa(job #2536320)

Utilizator Florinos123Gaina Florin Florinos123 Data 1 februarie 2020 19:59:53
Problema Castel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>

using namespace std;

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

int n, m, a[153][153], cheie[153][153], fr[22503], rez;
int startx, starty, start, lg;
int di[4] = {1, 0, -1, 0};
int dj[4] = {0, 1, 0, -1};
pair < int, int > cu_cheie[22503];
bool gasit, ok, used[153][153];

void read ()
{
 int i, j;
    f >> n >> m  >> start;
     for (i=1; i<=n; i++)
        for (j=1; j<=m; j++)
           f >> a[i][j];
}

bool valid (int i, int j)
{
    if (i<1 || j<1 || i>n || j>m)
        return false;
    return true;
}

void calc ()
{
    int i, j, aux = 0;
     for (i=1; i<=n; i++)
     {
         for (j=1; j<=m; j++)
         {
             aux ++;
             cheie[i][j] = aux;
             if (aux == start)
             {
                 startx = i;
                 starty = j;
             }
         }
     }
}
int main()
{
 read();
 calc();
 fr[cheie[startx][starty]] = 1;
 rez = 1;
 lg ++;
 cu_cheie[lg].first = startx;
 cu_cheie[lg].second = starty;
 used[startx][starty] = 1;
 gasit = true;
 int i, j, k, p, i_nou, j_nou;
   while (gasit)
   {
     ok = true;
       for (p=1; p<=lg; p++)
       {
           i = cu_cheie[p].first;
           j = cu_cheie[p].second;
             for (k=0; k<=3; k++)
             {
                 i_nou = i + di[k];
                 j_nou = j + dj[k];
                  if (valid(i_nou, j_nou) && fr[a[i_nou][j_nou]] == 1)
                  {
                      if (!used[i_nou][j_nou])
                      {
                          rez ++;
                          used[i_nou][j_nou] = 1;
                          fr[cheie[i_nou][j_nou]] = 1;
                          lg ++;
                          cu_cheie[lg].first = i_nou;
                          cu_cheie[lg].second = j_nou;
                          ok = false;
                      }
                  }
             }
       }
     if (ok)
        gasit = false;
   }
 g << rez;
    return 0;
}