Pagini recente » Cod sursa (job #1317280) | Cod sursa (job #2188870) | Cod sursa (job #1514822) | Cod sursa (job #929637) | Cod sursa (job #1329688)
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream in("castel.in");
ofstream out("castel.out");
const int NMAX = 150;
vector<int> key[NMAX * NMAX + 5];
int v[NMAX+ 5][NMAX + 5],viz[NMAX + 5][NMAX + 5],n,m,k,ok[NMAX * NMAX + 5],sol;
int d1[] = {1,0,-1,0};
int d2[] = {0,1,0,-1};
queue<int> coada;
void convert(int val,int &i,int &j)
{
i = val/m;
j = (val + m) % m;
if(j == 0)
j = m;
else
++i;
}
int cod(int i,int j)
{
return (i-1)*m+j;
}
void read()
{
in>>n>>m>>k;
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <= m ; j++)
in>>v[i][j];
in.close();
ok[k] = 1;
coada.push(k);
}
void bfs()
{
int c;
while(!coada.empty()){
c = coada.front();
int i,j;
convert(c,i,j);
for(int l = 0 ; l < key[c].size(); l++){
coada.push(key[c][l]);
ok[key[c][l]] = 1;
int h,g;
convert(key[c][l],h,g);
viz[h][g] = 1;
}
for(int x = 0 ; x < 4 ; x++){
int new_x = i + d1[x];
int new_y = j + d2[x];
if(!viz[new_x][new_y] && ok[v[new_x][new_y]] && new_x > 0 && new_x <= n && new_y > 0 && new_y <= m){
viz[new_x][new_y] = 1;
int p = cod(new_x,new_y);
coada.push(p);
ok[cod(new_x,new_y)] = 1;
}
else if(!viz[new_x][new_y] && !ok[v[new_x][new_y]] && new_x > 0 && new_x <= n && new_y > 0 && new_y <= m)
key[v[new_x][new_y]].push_back(cod(new_x,new_y));
}
coada.pop();
}
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <= m ; j++)
if(viz[i][j])
++sol;
out<<sol;
}
int main()
{
read();
bfs();
return 0;
}