Pagini recente » Cod sursa (job #2836843) | Cod sursa (job #2653592) | Cod sursa (job #1219353) | Cod sursa (job #238873) | Cod sursa (job #1870343)
#include <fstream>
#include <queue>
#include <vector>
#define nmax 151
using namespace std;
ifstream fin("castel.in");
ofstream fout("castel.out");
int n,m,k,c[nmax][nmax],a[nmax][nmax],rez;
bool ekey[nmax*nmax];
short int viz[nmax][nmax],si,sj;
short int dx[]= {-1,1,0,0};
short int dy[]= {0,0,-1,1};
vector < pair < int, int > > coada[nmax * nmax];
void read()
{
int i,j;
fin>>n>>m>>k;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
fin>>a[i][j];
coada[a[i][j]].push_back(make_pair(i,j));
c[i][j]=(i-1)*m+j;
if(c[i][j]==k)
{
si=i;
sj=j;
}
}
}
fin.close();
}
bool vecin(int x, int y)
{
if(viz[x][y]==1)
return true;
for(int dir=0; dir<4; dir++)
{
if(viz[x+dx[dir]][y+dy[dir]]==1)
return true;
}
return false;
}
void lee(int x, int y, queue < int > &coadalee)
{
if(ekey[a[x][y]])
{
if(!viz[x][y])
viz[x][y]=2;
if(vecin(x,y))
{
if(viz[x][y]!=1)
{
rez++;
viz[x][y]=1;
for(int dir=0;dir<4;dir++)
{
if(viz[x+dx[dir]][y+dy[dir]]==2 && ekey[a[x+dx[dir]][y+dy[dir]]])
coadalee.push(a[x+dx[dir]][y+dy[dir]]);
}
}
if(!ekey[c[x][y]] )
{
coadalee.push(c[x][y]);
ekey[c[x][y]]=true;
}
}
}
}
void fillk(int key)
{
int i;
queue < int > coadalee;
for(i=0; i<coada[key].size(); i++)
{
lee(coada[key][i].first, coada[key][i].second,coadalee);
}
while(!coadalee.empty())
{
fillk(coadalee.front());
coadalee.pop();
}
}
void solve()
{
ekey[k]=true;
viz[si][sj]=1;
rez=1;
fillk(k);
}
int main()
{
read();
solve();
fout<<rez;
fout.close();
return 0;
}