Pagini recente » Cod sursa (job #3154659) | Cod sursa (job #1539114) | Cod sursa (job #2669744) | Cod sursa (job #2194932) | Cod sursa (job #304078)
Cod sursa(job #304078)
#include<stdio.h>
#include<iostream.h>
#define MAX 180
int n,m,k;
int mat[MAX][MAX],used[MAX*MAX],C[MAX*MAX],i,j,cnt;
struct key { int val; key *last; } *K[MAX*MAX+2];
int decode(int valoare,int &lin,int &col)
{
lin=(valoare-1)/m; int var=lin*m; lin++; col=valoare-var;
}
int code(int &valoare,int lin,int col)
{
valoare=(lin-1)*m; valoare+=col;
}
int add(int var,int x)
{
key *p=new key;
p->val=x;
if(K[var]==NULL) { K[var]=p; p->last=NULL; return 0; }
p->last=K[var]; K[var]=p;
}
int algoritm(int x)
{
int var,lin,col; decode(x,lin,col); C[x]=used[x]=1; cnt++; cout<<x<<" ";
if(lin<n)
{code(var,lin+1,col); add(mat[lin+1][col],var);
if(C[mat[lin+1][col]]==1 && used[var]==0) algoritm(var); }
if(col<m)
{code(var,lin,col+1); add(mat[lin][col+1],var);
if(C[mat[lin][col+1]]==1 && used[var]==0) algoritm(var); }
if(col>1)
{code(var,lin,col-1); add(mat[lin][col-1],var);
if(C[mat[lin][col-1]]==1 && used[var]==0) algoritm(var); }
if(lin>1)
{code(var,lin-1,col); add(mat[lin-1][col],var);
if(C[mat[lin-1][col]]==1 && used[var]==0) algoritm(var); }
for(key *p=K[x]; p!=NULL; p=p->last) if(used[p->val]==0) algoritm(p->val);
}
int main()
{
freopen("castel.in","r",stdin);
freopen("castel.out","w",stdout);
scanf("%d %d %d",&n,&m,&k); // n linii, m coloane, k poz start
for(i=1; i<=n; i++)
for(j=1; j<=m; j++) scanf("%d",mat[i]+j);
algoritm(k); printf("%d\n",cnt);
cout<<endl<<endl;
}