Pagini recente » Cod sursa (job #2956431) | Cod sursa (job #1870274)
#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 viz[nmax][nmax],ekey[nmax*nmax];
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;
}
}
fin.close();
}
bool vecin(int x, int y)
{
if(viz[x][y]==true)
return true;
for(int dir=0; dir<4; dir++)
{
if(viz[x+dx[dir]][y+dy[dir]]==true)
return true;
}
return false;
}
void lee(int x, int y, queue < int > &coadalee)
{
if(ekey[a[x][y]])
{
if(!viz[x][y])
{
rez++;
viz[x][y]=true;
if(!ekey[c[x][y]] && vecin(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;
fillk(k);
}
int main()
{
read();
solve();
fout<<rez;
fout.close();
return 0;
}