Pagini recente » Cod sursa (job #1351322) | Borderou de evaluare (job #1898670) | Cod sursa (job #2290231) | Borderou de evaluare (job #155139) | Cod sursa (job #63006)
Cod sursa(job #63006)
#include <cstdio>
#include <vector>
#define NMAX 170
#define QMAX ((1<<16)-1)
int A[NMAX][NMAX], F[NMAX][NMAX], Desc[NMAX][NMAX];
int N, M, K, NrCam, Q[QMAX], Cheie[NMAX*NMAX];
int L[] = {0, 0, 1,-1};
int C[] = {1,-1, 0, 0};
using namespace std;
vector<int> Key[NMAX*NMAX];
int main()
{
int key, i, j, lo, hi, l, c, ll, cc;
freopen("castel.in", "r", stdin);
scanf("%d %d %d", &N, &M, &K);
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
scanf("%d", &A[i][j]), A[i][j]--;
Q[0] = --K;
Cheie[K] = 1;
Desc[ K/M ][ K%M ] = 1;
for (lo = 0, hi = 1; lo <= hi; lo = (lo+1)&QMAX)
{
l = Q[lo]/M; c = Q[lo]%M;
Cheie[ key = Q[lo] ] = 1;
for (i = Key[key].size()-1; i >= 0; i--)
{
ll = Key[ key ][i]/M; cc = Key[ key ][i]%M;
if (!Desc[ ll ][ cc ])
{
Desc[ ll ][ cc ] = 1;
Q[hi] = ll*M+cc; hi = (hi+1)&QMAX;
}
}
for (i = 0; i < 4; i++)
{
ll = l+L[i]; cc = c+C[i];
if (ll >= 0 && ll < N && cc >= 0 && cc < M)
{
if (Cheie[ A[ ll ][ cc ] ] && !Desc[ ll ][ cc ])
Q[hi] = (ll)*M+cc, hi = (hi+1)&QMAX, Desc[ll][cc] = 1;
else Key[ A[ll][cc] ].push_back((ll)*M+cc);
}
}
}
for (i = 0; i < N; i++)
for (j = 0; j < M; j++) NrCam+=Desc[i][j];
freopen("castel.out", "w", stdout);
printf("%d\n", NrCam);
return 0;
}