Pagini recente » Cod sursa (job #203163) | Cod sursa (job #1550452) | Cod sursa (job #2770907) | Cod sursa (job #1108324) | Cod sursa (job #930827)
Cod sursa(job #930827)
#include<cstdio>
#include<queue>
#include<utility>
#include<bitset>
#define NMAX 155
FILE *f=fopen("castel.in","r");
FILE *g=fopen("castel.out","w");
using namespace std;
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;
void read( void )
{
fscanf(f,"%d%d%d",&m,&n,&k);
vec.push_back(k);
for(int i(1); i <= m ; ++i )
for(int ii(1); ii <= n ; ++ii )
fscanf(f,"%d",&a[i][ii]);
fclose(f);
}
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;
fprintf(g,"%d",sol);
fclose(g);
}
int main( void )
{
read();
solve();
write();
return 0;
}