Pagini recente » Monitorul de evaluare | Istoria paginii planificare/sedinta-20071218 | Monitorul de evaluare | Diferente pentru utilizator/dornescuvlad intre reviziile 96 si 95 | Cod sursa (job #1354069)
#include <fstream>
#include <cstring>
#include <queue>
#define x first
#define y second
using namespace std;
ifstream fin ("castel.in");
ofstream fout ("castel.out");
const int dl[] = { -1, 0, 1, 0 };
const int dc[] = { 0, 1, 0, -1 };
int N, M, K, X, Y, sol, V[160][160];
bool B[22510], fr[160][160], OP[160][160];
queue < pair < int, int > > Q;
void Fiil(int i, int j)
{
K = (i - 1) * M + j;
B[K] = 1;
fr[i][j] = 1;
for (int k = 0; k < 4; k++)
{
int ii = i + dl[k];
int jj = j + dc[k];
if (!fr[ii][jj] && B[V[ii][jj]])
{
Fiil(ii, jj);
}
}
}
int main()
{
fin >> N >> M >> K;
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= M; j++)
{
fin >> V[i][j];
}
}
X = (K - 1) / M + 1;
Y = K % M;
if (!Y) Y = M;
B[K] = 1;
Fiil(X, Y);
Q.push(make_pair(X, Y));
while (!Q.empty())
{
int i = Q.front().x;
int j = Q.front().y;
Q.pop();
OP[i][j] = 1;
memset(fr, 0, sizeof(fr));
Fiil(i, j);
for (int k = 0; k < 4; k++)
{
int ii = i + dl[k];
int jj = j + dc[k];
if (!OP[ii][jj] && B[V[ii][jj]])
{
Q.push(make_pair(ii, jj));
}
}
}
for (int i = 1; i <= 22500; i++)
{
if (B[i]) sol++;
}
fout << sol << '\n';
fout.close();
return 0;
}