Cod sursa(job #930833)

Utilizator superman_01Avramescu Cristian superman_01 Data 27 martie 2013 20:47:45
Problema Castel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include<fstream>
#include<queue>
#include<utility>
#include<bitset>

#define NMAX 155
/*
FILE *f=fopen("castel.in","r");
FILE *g=fopen("castel.out","w");
*/
using namespace std;

ifstream f("castel.in");
ofstream g("castel.out");
vector <int> vec;

int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
int a[NMAX][NMAX];
int n,m,k;
//bitset<NMAX*NMAX> used;
bool used[NMAX*NMAX];
void read( void )
{
    f>>m>>n>>k;
  vec.push_back(k);

  for(int i(1); i <= m ; ++i )
    for(int ii(1); ii <= n ; ++ii )
       f>>a[i][ii];

       f.close();

}

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 solve( 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;
    g<<sol;
    g.close();

}
int main( void )
{
    read();
    solve();
    write();
    return 0;
}