Cod sursa(job #932225)

Utilizator crisbodnarCristian Bodnar crisbodnar Data 28 martie 2013 19:35:55
Problema Castel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<fstream>
#include<queue>
#include<utility>
#include<bitset>

#define NMAX 155
using namespace std;

ifstream fin("castel.in");
ofstream fout("castel.out");
vector <int> vec;

int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
int a[NMAX][NMAX];
int n,m,k;
bool used[NMAX*NMAX];

void Citire( void ){

    fin>>m>>n>>k;
    vec.push_back(k);

    for(int i=1; i <= m ; ++i )
        for(int j=1; j <= n ; ++j )
            fin>>a[i][j];
}

int coord_x( int numb ){
    return (numb-1)/n+1;
}

int coord_y( int numb ){
    return (numb-1)%n+1;
}

bool ok (int i,int j ){

    if(i<1 || i>m || j<1 || j>n)
        return 0;
    return 1;
}

int room(int i, int j ){
    return (i-1)*n+j;
}

void Rezolvare( void ){

    int ii=0,size = 1;
    used[k]=true;
   bool  oki=true;

   while( oki == true )
   {
       oki=false;
       ii=0;
    while(ii < size )
    {

        int x=coord_x(vec[ii]);
        int y=coord_y(vec[ii]);
         ++ii;
        for(int i(0); i < 4 ; ++i )
        {
            int newx=x+dx[i];
            int newy=y+dy[i];
            if( ok(newx,newy) )
            {
              if( used[a[newx][newy]] && !used[room(newx,newy)])
                {
                   used[room(newx,newy)]=true;
                   vec.push_back(room(newx,newy));
                   oki=true;
                   ++size;
                }

            }
        }

     }
   }
}
void write( void )
{
    int sol=0;
    for(int i(1) ; i<= n*m; ++i)
        if(used[i])
          ++sol;
    fout<<sol;

}
int main( void )
{
    Citire();
    Rezolvare();
    write();
    return 0;
}