Pagini recente » Cod sursa (job #2682141) | Cod sursa (job #1392679) | Cod sursa (job #723036) | Cod sursa (job #2660145) | Cod sursa (job #1086192)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream fin("castel.in");
ofstream fout("castel.out");
#define MAX 156
int a[MAX][MAX];
int di[]={0,0,1,-1};
int dj[]={1,-1,0,0};
bool viz[MAX][MAX], aproape[MAX][MAX], accesibil[MAX][MAX];
vector <int> keys[MAX*MAX];
queue <int> coada;
int n, m, k;
void open(int key)
{
for(int i=0;i<keys[key].size();i++)
{
int xi=keys[key][i]/m, xj=keys[key][i]%m;
accesibil[xi][xj]=1;
if(aproape[xi][xj] && !viz[xi][xj])
{
coada.push(xi*m+xj);
}
}
}
int main()
{
int i, j, r, x, y, x1, y1;
fin>>n>>m>>k;
k--;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
fin>>a[i][j];
a[i][j]--;
keys[a[i][j]].push_back(i*m+j);
}
}
coada.push(k);
accesibil[k/m][k%m]=1;
int s=0;
while(coada.size())
{
r=coada.front();
coada.pop();
x=r/m;
y=r%m;
viz[x][y]=1;
open(r);
for(int e=0;e<4;e++)
{
x1=x+di[e];
y1=y+dj[e];
if(x1<0 || x1>n || y1<0 || y1>m)
continue;
aproape[x1][y1]=1;
if(accesibil[x1][y1] && !viz[x1][y1])
coada.push(x1*m+y1);
}
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(aproape[i][j] && accesibil[i][j])
s++;
}
}
fout<<s<<" ";
}