Pagini recente » Cod sursa (job #753056) | Cod sursa (job #2803414) | Cod sursa (job #2637738) | Cod sursa (job #725030) | Cod sursa (job #575080)
Cod sursa(job #575080)
#include <stdio.h>
#define MAX 22505
short v[MAX];
char use[MAX],need[MAX];
short M,N,sol;
struct queue
{
short nod;
queue *link;
}*key[MAX];
inline void add(short x,short K)
{
queue *p;
p=new queue;
p->nod=K;
p->link=key[x];
key[x]=p;
}
inline void unlock(short x);
inline void code(short K);
inline void crack(short K);
inline void unlock(short x)
{
queue *p;
short K;
while(key[x]!=NULL)
{
K=key[x]->nod;
p=key[x];
key[x]=key[x]->link;
delete p;
if(v[K]>0)
{
use[K]=1;
v[K]=0;
sol++;
unlock(K);
crack(K);
}
}
}
inline void code(short K)
{
if(v[K]>0)
if(use[v[K]])
{
use[K]=1;
v[K]=0;
sol++;
unlock(K);
crack(K);
}
else
if(need[K]==0)
{
need[K]=1;
add(v[K],K);
}
}
inline void crack(short K)
{
if(K%N!=1) code(K-1);
if(K%N!=0) code(K+1);
if(K>N) code(K-N);
if(K<=(M-1)*N) code(K+N);
}
int main()
{
short i,K;
freopen("castel.in","r",stdin);
scanf("%hd%hd%hd",&M,&N,&K);
for(i=1;i<=M*N;i++)
{
scanf("%hd",&v[i]);
use[i]=0;
key[i]=NULL;
need[i]=0;
}
use[K]=1;
v[K]=0;
sol=1;
crack(K);
freopen("castel.out","w",stdout);
printf("%hd\n",sol);
return 0;
}